作者khoguan (Khoguan Phuann)
看板C_and_CPP
標題Re: [FAQ&FME] C 語言新手十誡
時間Sat Aug 27 01:18:15 2005
※ 引述《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
1F:推 sekya:記得以前常犯這種錯。 59.104.34.112 08/27
2F:→ sekya:unsigned char sek = 0,k = 0,i; 59.104.34.112 08/27
3F:→ sekya:for( i=10; i>=k; i-- ) 59.104.34.112 08/27
4F:→ sekya: sek++; 59.104.34.112 08/27
5F:→ sekya:上面是無窮迴圈 59.104.34.112 08/27
6F:→ sekya:會這樣錯的原因是因為字串的length是unsigned的 59.104.34.112 08/27
7F:→ sekya:如果從字串尾到字串頭的迴圈,就有機會無窮迴圈。 59.104.34.112 08/27
8F:→ khoguan:感謝提供這個實例220.130.208.168 08/28