2016-11-21 20 views
0

我想知道为什么这段代码的printf焦炭的Ç无限:这段代码打印的次数是多少?

char c; 
for (c = 0; c< 256; c++) 
printf("Char c=%c\n", c); 

感谢

+3

因为'char'值***总是***小于'256'(假设'CHAR_BIT'是'8'赫赫)。 –

+0

'char'值为0-255(或-128-127考虑符号位),所以255 + 1回绕到0 ,,所以你的条件'c <256'总是为真。 – yano

+1

将'%c'改为'%d',答案应该清楚。 – user3386109

回答

1

因为char数据类型只有一个字节长,因此只能保存的值0-255

所以当c255和你做c++,就变成0。因此,c总是< 256在循环。

+0

这假设一个简单的'char'是无符号的,这几乎从未如此。 – user3386109

+0

@ user3386109:好点,虽然逻辑保持不变。 – David

+1

@David严格来说,聊天只是一个字节,可以容纳'CHAR_BIT'位,这至少是8个。 – AlexD

3

假设CHAR_BIT是8(它几乎总是),char对象不能表示值256;签署char将最大程度的发挥,在127,而签名char将最大程度的发挥以255

签名的情况下

c是127,你加1,值“溢出”。因为在一些古怪的体系结构中,补码和符号幅度表示仍然是一个问题,所以确切的结果可能会有所不同。对于二进制补码,它将“环绕”到-128,而对于补码,它将环绕到-127,对于符号幅度它将变为-0。

所有这些值都小于256,因此条件c < 256始终为真。

因为结果可能基于该平台上,C语言定义的地方没有要求编译器来处理符号整数溢出任何特殊的方式 - 行为留下不确定,任何结果同样是“正确的”就语言而言。一个相当聪明的编译器可能能够检测到条件总是被评估为真并发出警告,并且就语言定义而言,它可以自由地做到这一点。或不。

无符号情况下

不同于签名的情况下,无符号整数溢出是良好定义的;如果c是255并且加1,那么结果回绕到0.同样,0小于256,因此c < 256将始终为真。