为什么这个循环在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'是一个多字符文字。 它在编程中并不常见,它是“鲜为人知”的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 (“真”)。 即使提升为int类型,变量a也永远不会包含大于MAX_CHAR 。 但是多字符文字'hi'是一个int值,其值大于编译器实现中的值

a < m可以成功的原因是,当声明m ,你用'hi'初始化它,它被转换为char类型,它确实有机会与其他char进行比较。