为什么这个程序导致无限循环?

时间:2018-01-25 17:59:02

标签: c for-loop character

我尝试了以下程序,

#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'

在第一个程序中导致无限循环。

1 个答案:

答案 0 :(得分:2)

根据说明我们可以说char已在您的系统中签名(最大值为127 - SCHAR_MAX)。当您向其添加'('时,您正在添加40 120(结果160大于127)并导致实施定义行为。 (在你的情况下,它应该得到一个小于'x'的值,这就是循环没有停止的原因 - 但这是你不能依赖的东西 - *这是实现定义的行为)。

你也在评论中询问 - 为什么它不会停在120(在第一种情况下)?首先,您的条件为<='x',因此当值等于值'x'时,该值将递增。

修改:还有一件事 - 这是未定义的行为 - char被提升为int,然后结果转换为char。这种转换是实现定义的行为。(对于整数类型比int更窄的整数类型没有算术运算,这就是整数提升的原因)[注意:Keith Thompson]