Re: [FAQ&FME] C 語言新手十誡

看板C_and_CPP (C/C++)作者 (Khoguan Phuann)時間19年前 (2005/08/27 01:01), 編輯推噓1(107)
留言8則, 2人參與, 最新討論串8/14 (看更多)
※ 引述《sekya (懶~皮卡~暈)》之銘言: : 看看這個適不適合加進入。 : 注意變數的range,要想辦法避免這些問題。 : 錯誤範例: PS.在某些平臺下 b 也會ok!! 正常來說 b always false. : #include <stdio.h> : : int main(void){ : unsigned char a = 0x80; : char b = 0x80; /* (1) */ : if( a == 0x80 ){ : printf( "a ok\n" ); : } : if( b == 0x80 ){ /* (2) */ : printf( "b ok\n" ); : } : } 感謝提供這個寶貴的問題,值得收入十誡或 FAQ 中。 C++ 中的 standard conversion 規則,為了相容於 C, 整個從 C 繼承過來,但是 C 在這方面的規則實在太複雜, 很容易踩到陷阱。 : 推 slchen:沒錯...不然會發生segmentation fault.. 220.141.227.153 08/26 slchen大大曾在哪個平台用哪種compiler 編譯執行上述 程式而得到 seg. fault 的嚴重結果呢?如果這樣,那就 有趣了 :-) 據我所知,上面的 (1) 是會讓 char b 初始化為一個 implementation-defined value 雖然是 implementation-defined (該implementation的文件有義務明白define), 但還是 有個 value,應該還不至於造成執行期 seg. fault 的後果。 至於當執行到 (2)時,b 的值會 promote 成 int 再和 int 0x80 比較,結果不是 true 就是 false, 更不可能 seg. fault了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.168

59.104.34.112 08/27, , 1F
記得以前常犯這種錯。
59.104.34.112 08/27, 1F

59.104.34.112 08/27, , 2F
unsigned char sek = 0,k = 0,i;
59.104.34.112 08/27, 2F

59.104.34.112 08/27, , 3F
for( i=10; i>=k; i-- )
59.104.34.112 08/27, 3F

59.104.34.112 08/27, , 4F
sek++;
59.104.34.112 08/27, 4F

59.104.34.112 08/27, , 5F
上面是無窮迴圈
59.104.34.112 08/27, 5F

59.104.34.112 08/27, , 6F
會這樣錯的原因是因為字串的length是unsigned的
59.104.34.112 08/27, 6F

59.104.34.112 08/27, , 7F
如果從字串尾到字串頭的迴圈,就有機會無窮迴圈。
59.104.34.112 08/27, 7F

220.130.208.168 08/28, , 8F
感謝提供這個實例
220.130.208.168 08/28, 8F
文章代碼(AID): #133qhJGj (C_and_CPP)
文章代碼(AID): #133qhJGj (C_and_CPP)