为什么这个循环在 c 中是 运行 无限次?

why this loop is running infinite times in c?

我只是在用 C 编程试验一段代码。并且知道了一个奇怪的行为。 嗯...因为我不是C专家,所以我不知道它是奇怪还是正常。

基本上我的问题是关于以下两行代码之间的区别:-

char a = 'h'; // here variable a is not an array of "char"

char a = 'hi'; //here variable a is not an array of "char" as well (i don't know if compiler assumes it as an array or not but , at least i didn't declared it that way )

我使用了以下代码

第一:-

char a =0;
for(;a<'hi';a++)
{
    printf("%d= hello world \n",a);
}

秒:-

char a;
for(a='h';a<'hi';a++)
{
    printf("%d= hello world \n",a);
}

上面提到的两个循环都保持 运行 永远,

有人能告诉我为什么吗?

我可能缺少一个非常基本的编程概念。请大家帮帮我

那是因为 'hi' 的类型是 int 而不是 char。它还解析为值 26729。但是循环变量最有可能(假设 char 是 1 字节类型并且字节有 8 位)被限制为 127,然后溢出。

注意这个:

char a =0;
char m = 'hi';
for(; a < m; a++)
{
    printf("%d= hello world \n",a);
}

将起作用,因为 'hi' 将被强制转换为 char (105)。

'hi' 是一个多字符文字。这在编程中并不常见,它是 "less known" C 特性,它已成为 C99 标准的一部分。有关它们的更多信息:http://zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html

在 C 中(与 C++ 相对,如某些评论中引用的那样),字符文字,始终 具有类型 int。不管它是普通的单字符文字,例如 'c',还是多字符文字,例如 'hi'。它始终具有类型 int,要求至少保留 16 位。 char 正好包含一个字节。

比较不同类型的整数值时,整数提升规则开始生效,较小的整数值被提升为较大的整数值。 这就是为什么 a < 'hi' 只能是 1 ("true")。即使提升为 int 类型,变量 a 也永远不能容纳任何大于 MAX_CHAR 的东西。但是多字符文字 'hi' 是一个 int,其值大于编译器实现中的 .

a < m能成功的原因是在声明m时,你用'hi'初始化它,它被转换为char类型,这确实有机会比较不少于另一个 char.