【发布时间】:2021-10-31 21:39:38
【问题描述】:
我几乎认为这是一个愚蠢的问题......但我真的找不到答案。所以我在这里问这个。
为了了解隐式类型转换,我在 C 上运行以下代码。
#include <stdio.h>
int main()
{
unsigned char i;
char cnt = -1;
int a[255];
for (int k = 0; k < 255; k++)
{
a[k] = k;
}
for (i = cnt - 2; i < cnt; i--)
{
a[i] += a[i + 1];
printf("%d\n", a[i]);
}
return 0;
}
当我运行这个程序时,什么也没发生。
我在第一次迭代时发现for循环的循环条件为假,所以程序立即退出了for循环。
但是,我不明白为什么。
据我所知,C 在分配或比较不同类型的变量时会进行隐式转换。所以我认为在i = cnt - 2 上,减法运算使值-3,然后隐式转换为i 分配值253。
那么,条件 i < cnt 不应该为真,因为(由于有符号和无符号字符的比较,通过 cnt 的另一个隐式转换)253 小于 255?
如果不是,为什么这是错误的?有什么我遗漏的,或者有什么我不知道的例外吗?
【问题讨论】:
-
253 不小于 -3 :) cnt 数据类型不是 unsigned char,只是 char -128 到 127。如果你让 unsigned char cnt = -1。它会正常工作。
-
@Tevfik Kadan 我有点困惑。当我按照你说的做同样的事情时它确实有效,但是在做
i < cnt时不应该将cnt自动转换为unsigned char并变成255吗?我刚试过printf("%d\n", (unsigned char)253 < (char) -1),它也给出了错误... -
普通字符是否签名由实现定义。 学习隐式类型转换的目的 没有隐式类型转换这回事。根据定义,所有强制转换都是显式的。如果您想了解隐式类型转换,首先要学习的是不惜一切代价避免它们。
-
请参阅this discussion on implicit type promotions。 (如前所述,implicit 强制转换不是一回事。强制转换总是显式的。)
-
这是一个演员表:(type)。它正在使用强制转换运算符。这是 C 中唯一存在的强制转换,并且程序员始终是显式的,从而触发显式转换。还有各种隐式转换。但是没有隐式转换。
标签: c for-loop char integer-promotion relational-operators