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'