C 为什么这个程序会导致无限循环?
我尝试了以下程序C 为什么这个程序会导致无限循环?,c,for-loop,character,C,For Loop,Character,我尝试了以下程序 #include<stdio.h> int main(void) { char ch; for(ch='(';ch<='x';ch+='(') { printf("%c\n",ch); } return 0; } (ASCII值'('为40,'p'为80,'x'为120) 但是程序生成了一个无限循环 然后我尝试了另一个程序 #include<stdio.h> int main(voi
#include<stdio.h>
int main(void)
{
char ch;
for(ch='(';ch<='x';ch+='(')
{
printf("%c\n",ch);
}
return 0;
}
(ASCII值'('为40,'p'为80,'x'为120)
但是程序生成了一个无限循环
然后我尝试了另一个程序
#include<stdio.h>
int main(void)
{
char ch;
for(ch='(';ch<'x';ch+='(')
{
printf("%c\n",ch);
}
return 0;
}
所以我不明白为什么
ch<='x'
ch根据描述,我们可以说char
是在您的系统中签名的(最大值为127
-SCHAR_max
)。当您添加'('
时,您添加了40
和120
(结果是160
,大于127
)并导致实现定义的行为(在您的例子中,假设它得到的值小于'x'
,这就是循环没有停止的原因-但这是您不能依赖的-*这是实现定义的行为)
您也在评论中问过-为什么它不停在120
(在第一种情况下)?首先,您的情况是,根据描述,我们可以说char
在您的系统中签名(最大值127
-SCHAR\u max
)。当您添加'(“
向其中添加40
和120
(结果是160
大于127
),并导致实现定义的行为。(在您的例子中,假设它得到的值小于'x'
,这就是循环没有停止的原因-但这是您不能依赖的-*这是实现定义的行为)
你在评论中也问过-为什么不停在120
(在第一种情况下)?首先,你的条件是在调试器中单步执行代码会告诉你什么?(这是一个非常简单的循环;单步执行四次应该可以回答这个问题,在这个过程中你会学到一些东西。)检查char ch
上的数据范围。这是一个有符号的值。-128
到127
。重复添加”(“
时,值为40、80、120、160(哎哟,现在真的是-96了,这就是请缩进你的代码。@潜伏者这可能是一个愚蠢的问题,但为什么不在120处停止呢?因为它将尝试下一次迭代。这就是for
循环的工作方式。在for(i=0;i)的末尾,在调试器中逐步遍历代码告诉你什么?(这是一个非常简单的循环;通过四次应该可以回答这个问题,您将在过程中学到一些东西。)检查char ch
上的数据范围。这是一个有符号的值。-128
到127
。当您反复添加”(
时,值是40、80、120、160(哎哟,现在真的是-96了,这就是请缩进你的代码。@潜伏者这可能是一个愚蠢的问题,但为什么不在120处停止呢?因为它将尝试下一次迭代。这就是for
循环的工作方式。在for(i=0;i)的末尾,我好像误解了for循环的工作方式。谢谢!这里有(很可能)没有未定义的行为。在小于int
的整数类型上没有算术运算。将char
值提升为int
,执行加法,并通过赋值将结果转换回char
。如果结果超出范围,则转换的结果为de罚款。(“
属于int
类型。)@KeithThompson.:再次-是,我编辑了。定义的实现和未定义的实现是不同的。感谢另一个小点:超出范围的整数转换要么产生实现定义的值,要么(从C99开始)引发一个实现定义的信号——它几乎可以做任何事情。我不知道有任何实现可以做到这一点。另外,原则上,int
可以是1字节(如果CHAR\u BIT>=16
),然后,根据的数值(“
,溢出可能有UB。对于这两种可能性我都不会睡太多觉。@KeithThompson.:int
ti是1字节?CHAR\u BIT=8
always?你所说的最后一部分是正确的,如果有符号整数运算溢出,它就是UB。但为什么我们必须CHAR\u BIT>=16
标准说它在什么地方?看起来我误解了for循环的工作原理。谢谢!有(很可能)没有未定义的行为。在小于int
的整数类型上没有算术运算。将char
值提升为int
,执行加法,并通过赋值将结果转换回char
。如果结果超出范围,则转换的结果为de罚款。(“
属于int
类型。)@KeithThompson.:再次-是,我编辑了。定义的实现和未定义的实现是不同的。感谢另一个小点:超出范围的整数转换要么产生实现定义的值,要么(从C99开始)引发一个实现定义的信号——它几乎可以做任何事情。我不知道有任何实现可以做到这一点。另外,原则上,int
可以是1字节(如果CHAR\u BIT>=16
),然后,根据的数值(“
,溢出可能有UB。对于这两种可能性我都不会睡太多觉。@KeithThompson.:int
ti是1字节?CHAR\u BIT=8
always?你所说的最后一部分是正确的,如果有符号整数运算溢出,它就是UB。但为什么我们必须CHAR\u BIT>=16
标准说它在什么地方?
(
P
ch<='x'