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

时间:2015-01-28 09:49:23

标签: c for-loop 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);
}

上述两个循环都会永远运行,

有人可以告诉我为什么会这样吗?

我可能错过了一个非常基本的编程概念。请帮帮我们

2 个答案:

答案 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