我正在尝试打印Ascii字符,我发现使用char c = NUM; printf("%c", c);
可以用于某些数字(尝试使用某些字母表的Ascii数字)但有些会导致运行时错误,为什么会这样?
#include <stdio.h>
int main(void) {
for(int i = 0; i < 128; i++){
printf("%c", i); // WORKS FINE
}
for(char c = '!'; c < '~'; c++){
printf("%c", c); //WORKS FINE
}
#if 0
for(char d = 0; d < 128; d++){
printf("%c", d); //IF REMOVED #if 0 --> RUNTIME ERROR
}
#endif
// HOWEVER
char e = 105;
printf("%c", e); //OK
return 0;
}
那么,为什么最后一部分工作而第三部分for循环不是?
在看到下面的答案后,我明白我的循环已经病态了,我应该在127而不是128时停止它。但是,当我尝试这个改变时 - 它根本没有输出:
for(unsigned char c = 0; c < 255; c++){
printf("%c", c);
}
AND
for(char c = -128; c < 127; c++){
printf("%c", c);
}
答案 0 :(得分:5)
使用警告进行编译总是有帮助:
char.c:9:2: warning: comparison is always true due to limited range of data type [-Wtype-limits]
for(char d = 0; d < 128; d++){
^
签名角色可以容纳的最大值是127.因此,循环永远不会结束,并且会在-128到127之间永久循环。
编辑:
但正如@SilasAbrusco所提到的:当d增加到127之后,行为实际上是未定义的,请参阅:Is signed integer overflow still undefined behavior in C++?
答案 1 :(得分:2)
char
显然是您系统上的签名类型。这意味着最大的值是+127。
所以你的for
循环永远不会终止。实际上你有未定义的行为,因为你将溢出签名的char
类型。
在char
未签名的平台上,您的for
循环可行。但它不便携。
此外,printf
使用低于32的char
会在您的终端上做一些奇怪的事情,因为它们是控制字符。例如,7可能会发出哔哔声。
for(unsigned char c = 32; c <= 126; c++){
printf("%c", c);
}
肯定会正确打印。
答案 2 :(得分:0)
你有char变量的问题,因为它是签名你已经使用了位符号显示字符,所以当你有 1 1111111时你的情况是-127不是128所以 d 低于 128 所以for循环继续d ++ = -126,...等,所以for循环:
Dictionary<int, List<MyObj>>