Re: [FAQ&FME] C 語言新手十誡
看板C_and_CPP (C/C++)作者khoguan (Khoguan Phuann)時間19年前 (2005/08/27 01:01)推噓1(1推 0噓 7→)留言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
59.104.34.112 08/27, 2F
→
59.104.34.112 08/27, , 3F
59.104.34.112 08/27, 3F
→
59.104.34.112 08/27, , 4F
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
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
討論串 (同標題文章)
完整討論串 (本文為第 8 之 14 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章