[問題] 解析順序問題

看板C_and_CPP作者 (qq)時間11年前 (2014/06/16 09:52), 編輯推噓6(6033)
留言39則, 10人參與, 最新討論串1/1
請問第三行的(int*)是什麼意思?(int*)和(vptr)的順序是? int var = 10; void *vptr = &var ; int *iptr = (int*)(vptr); -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.235.58.180 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1402912368.A.6FA.html

06/16 18:45, , 1F
printf("0x%x\n",vptr);
06/16 18:45, 1F

06/16 18:46, , 2F
printf("0x%x\n",ptr);
06/16 18:46, 2F

06/16 18:51, , 3F
int *vptr; vptr = &var; google: pointer
06/16 18:51, 3F

06/16 18:54, , 4F
意思是把 vptr 從 void* 強制轉型成 int*
06/16 18:54, 4F

06/16 20:38, , 5F
請問()這個是一定要加的嗎?
06/16 20:38, 5F

06/16 20:43, , 6F
哪一個()? C 是規定第一個要加, 第二個沒什麼疑義的話可免
06/16 20:43, 6F

06/16 20:44, , 7F
C++ 則是加任一個即可, 但只加後面的嚴格說來並不是轉型運算
06/16 20:44, 7F

06/16 20:44, , 8F
也就是說如果真的想表達轉型的話就是第一個()加上去就對了
06/16 20:44, 8F

06/16 20:45, , 9F
第二個 () 純粹只是用來表示誰拿來轉型
06/16 20:45, 9F

06/16 21:50, , 10F
C++ 用static_cast<>會不會比較好呢
06/16 21:50, 10F

06/16 22:52, , 11F
static_cast 跟 c 語法的強制轉形是一樣的,不檢查的
06/16 22:52, 11F

06/16 23:03, , 12F
static_cast絕不等於C式轉型,他會在compile time檢查
06/16 23:03, 12F

06/16 23:17, , 13F
這其實是一個很典型的「拿void*去裝任何東西」的寫法
06/16 23:17, 13F

06/16 23:17, , 14F
C就算了 C++請完全避免這種行為
06/16 23:17, 14F

06/16 23:18, , 15F
另外C式轉型 像是這個 其實很大一部份都是reinterpret
06/16 23:18, 15F

06/16 23:18, , 16F
reinterpret_cast就是「完全不檢查」的轉法 請絕對避免
06/16 23:18, 16F

06/16 23:18, , 17F
在C++裡面出現這種行為
06/16 23:18, 17F

06/16 23:29, , 18F
lib用void* userdata附加lib不需要知道的資料很正常吧
06/16 23:29, 18F

06/17 02:29, , 19F
請問static_cast 在 compiler 檢查什麼?
06/17 02:29, 19F

06/17 08:46, , 20F
檢查多形之類的吧, C++ 要檢查的東西可多了
06/17 08:46, 20F

06/17 10:18, , 21F
多型是run-time的事情 static_cast無法檢查..
06/17 10:18, 21F

06/17 10:20, , 22F
static_cast不能在指標與非指標間轉換ex: int to int*
06/17 10:20, 22F

06/17 10:27, , 23F
比較常遇到不能轉的例子還有const和non-const
06/17 10:27, 23F

06/17 10:28, , 24F
staic_cast會把完全不合理的轉換擋掉
06/17 10:28, 24F

06/17 10:29, , 25F
像是完全不相干的兩個class指標
06/17 10:29, 25F

06/17 10:37, , 26F
完全不相干的兩個class沒有方法直接轉吧 用()也一樣..
06/17 10:37, 26F

06/17 10:37, , 27F
基本型別例外
06/17 10:37, 27F

06/17 10:59, , 28F
http://ideone.com/m4LQMJ 可reinterpret_cast
06/17 10:59, 28F

06/17 10:59, , 29F
C Style Cast的含意太多了所以c++才把他分開
06/17 10:59, 29F

06/17 11:01, , 30F
我誤解了你的意思 sry
06/17 11:01, 30F

06/17 11:06, , 31F
C很常見是因為無奈 xd C++除了塞thread資料以及相容舊
06/17 11:06, 31F

06/17 11:06, , 32F
C Libs以外 實在沒有什麼理由去塞void*
06/17 11:06, 32F

06/17 11:08, , 33F
況且現在有std::thread了 更該避免這種行為
06/17 11:08, 33F

06/17 11:09, , 34F
我是認為 在僅使用四大轉型的前提下,只要用到dynamic
06/17 11:09, 34F

06/17 11:09, , 35F
就代表這code設計有改進空間 用到const cast代表這code
06/17 11:09, 35F

06/17 11:10, , 36F
需要嚴格再檢視 至於出現reinterpret...大概八成是哪裡
06/17 11:10, 36F

06/17 11:10, , 37F
作錯了才需要這樣轉
06/17 11:10, 37F

06/18 17:08, , 38F
所以是因為強制轉型的關係int* 要變成(int *)這個意思嗎?
06/18 17:08, 38F

06/19 01:41, , 39F
強制轉型的語法就是型別括起來放前面
06/19 01:41, 39F
文章代碼(AID): #1JdhvmRw (C_and_CPP)