作者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