为什么这个循环在 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
.
我只是在用 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
.