我尝试了以下程序,
#include<stdio.h>
int main(void)
{
char ch;
for(ch='(';ch<='x';ch+='(')
{
printf("%c\n",ch);
}
return 0;
}
我希望程序提供以下输出,
(
P
x
('='的ASCII值为','P'为80,'x'为120)
但程序产生了无限循环。
然后我尝试了另一个程序,
#include<stdio.h>
int main(void)
{
char ch;
for(ch='(';ch<'x';ch+='(')
{
printf("%c\n",ch);
}
return 0;
}
这次输出是,
(
P
所以我无法理解为什么,
ch<='x'
在第一个程序中导致无限循环。
答案 0 :(得分:2)
根据说明我们可以说char
已在您的系统中签名(最大值为127
- SCHAR_MAX
)。当您向其添加'('
时,您正在添加40
120
(结果160
大于127
)并导致实施定义行为。 (在你的情况下,它应该得到一个小于'x'
的值,这就是循环没有停止的原因 - 但这是你不能依赖的东西 - *这是实现定义的行为)。
你也在评论中询问 - 为什么它不会停在120
(在第一种情况下)?首先,您的条件为<='x'
,因此当值等于值'x'
时,该值将递增。
修改:还有一件事 - 这是不未定义的行为 - char
被提升为int
,然后结果转换为char
。这种转换是实现定义的行为。(对于整数类型比int
更窄的整数类型没有算术运算,这就是整数提升的原因)[注意:Keith Thompson]