Re: [問題] C語言指標問題

看板C_and_CPP作者 (老人家)時間14年前 (2011/07/19 09:29), 編輯推噓1(1024)
留言25則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《newboy (完了)》之銘言: : 小弟本人是C的新手,有個題目搞不懂為什麼? : 想請各位大大幫我做詳細解答 抱歉小弟也是C新手 看完以後很多地方都不清楚特地發文向大大們請益 : #include <stdio.h> : #include <stdlib.h> : int main() : { : int a[]={6,7,8,9,10}; 問題1 這裡a[0]= 6 對嗎? : int *ptr = a; : *(ptr++)+=123; 問題2 假設a[0]=6,表示*ptr也等於6,那麼*(ptr++)=7對嗎? : printf("*ptr=%d,*ptr++=%d\n",*ptr,*ptr++); 問題3 ptr的位址已經被++過了,所以*ptr=7,*符號比++優先,所以*ptr++=8 : system("pause"); : return 0; : } : Ans:*ptr=8,*ptr++=7 -->所以答案我怎麼算都不對 囧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.181.219.92

07/19 17:29, , 1F
坦白說我會建議新手別把時間花在這種奇怪的程式碼...XD
07/19 17:29, 1F

07/19 17:43, , 2F
你似乎誤會了推文了 :)
07/19 17:43, 2F

07/19 17:45, , 3F
右到左 指的是printf...
07/19 17:45, 3F

07/19 17:47, , 4F
那我改一下內容
07/19 17:47, 4F
※ 編輯: NoobImage 來自: 175.181.219.92 (07/19 17:49)

07/19 20:12, , 5F
這個程式整個都沒有定義,完全取決於實作 xD 正確答案是
07/19 20:12, 5F

07/19 20:13, , 6F
什麼事情都有可能發生(像格式化你的硬碟)詳情見原文推文
07/19 20:13, 6F

07/19 20:13, , 7F
另外我也贊同不要浪費時間研究這種奇怪的程式碼...
07/19 20:13, 7F

07/19 20:46, , 8F
我在想這要執行幾次才有辦法格式化硬碟XD
07/19 20:46, 8F

07/19 21:08, , 9F
http://tinyurl.com/2cyfmmx tinlans講得很清楚
07/19 21:08, 9F

07/19 21:08, , 10F
不懂原因也無所謂 正常有腦的人不會寫出這東西
07/19 21:08, 10F

07/19 21:50, , 11F
你可以自己寫編譯器讓它格式化硬碟,還可以宣稱符合標準xD
07/19 21:50, 11F

07/19 21:52, , 12F
感謝各位的熱情回應 我大致上瞭解了
07/19 21:52, 12F

07/19 21:54, , 13F
這樣看起來我的邏輯還算可以= = 答案不是 7 7 就是 7 8
07/19 21:54, 13F

07/19 21:54, , 14F
也有編譯器採取安全的作法讓一些未定義行為變得較「安全」
07/19 21:54, 14F

07/19 21:55, , 15F
@NoobImage 答案是什麼都可以 印出 100 100 100 也無所謂
07/19 21:55, 15F

07/19 21:57, , 16F
完全要看實作怎麼做... 而且實作如何做都符合標準。
07/19 21:57, 16F

07/19 23:26, , 17F
如果把*ptr++改成*(ptr+1)是不是安全的寫法
07/19 23:26, 17F

07/20 01:04, , 18F
Q2:應該是*(ptr++)=a[0]吧?
07/20 01:04, 18F

07/20 01:18, , 19F
Q3:沒規定*ptr 跟 *(ptr++)哪個會先做的樣子
07/20 01:18, 19F

07/20 01:37, , 20F
前置 與後置 的情況
07/20 01:37, 20F

07/20 05:43, , 21F
@NoobImage 應該吧 但這樣 Q2 的 ptr++ 結果會是原來指標
07/20 05:43, 21F

07/20 05:44, , 22F
@shomingchang 未定義行為會汙染整個程式,包括 Q1 和 Q2
07/20 05:44, 22F

07/20 05:47, , 23F
怎麼做全看實作。然後 Q3 未定義的原因是因為 ptr 有一次
07/20 05:47, 23F

07/20 05:49, , 24F
讀取不是為了算新值。如果只是順序未指定,像隔壁高考題目
07/20 05:49, 24F

07/20 05:50, , 25F
其中某一行的狀況,就(比較)沒那麼嚴重 xD
07/20 05:50, 25F
文章代碼(AID): #1E9KvU0v (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
問題
7
23
完整討論串 (本文為第 2 之 2 篇):
問題
7
23
文章代碼(AID): #1E9KvU0v (C_and_CPP)