我只是在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);
}
上述两个循环都会永远运行,
有人可以告诉我为什么会这样吗?
我可能错过了一个非常基本的编程概念。请帮帮我们
答案 0 :(得分:10)
这是因为'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'
是一个多字符文字。这在编程中并不常见,它的知名度较低。 C功能成为C99标准的一部分。有关它们的更多信息:http://zipcon.net/~swhite/docs/computers/languages/c_multi-char_const.html
答案 1 :(得分:1)
在C语言中(与某些评论中引用的C ++相对),字符文字总是具有类型int
。如果它是普通的单字符文字(例如'c')或多字符文字(例如'hi')并不重要。它始终具有类型int
,需要至少保留16位。 char
只保存一个字节。
当比较不同类型的整数值时,引入整数提升规则,并将较小大小的整数值提升为较大的值。
这就是为什么a < 'hi'
只能是1
(“true”)的原因。即使提升为int
类型,变量a
仍然不能包含大于MAX_CHAR
的任何内容。但多字符文字'hi'
是一个int
,其值大于编译器实现中的 。
a < m
成功的原因是,在声明m
时,您使用'hi'
初始化它,并将其转换为char
类型,这确实有机会进行比较不低于其他char
。