令我惊讶的是 Xcode 编译 C (gnu11)
#include <stdio.h>
int main(int argc,char**argv)
{
short s = 1;
printf( "%zd %zd %zd\n", sizeof(s), sizeof(s*s), sizeof(s?s:s));
return 0;
}
产生输出
2 4 4
我正期待着
2 2 2
或者可能
2 4 2
为什么是这样?
我记得 K&R 中任何小于 int 的整数表达式都会提升为 int。我发现这个在标准(C89) http://flash-gordon.me.uk/ansi.c.txt:
3.2.1.1 字符和整数
一个 char、一个短 int 或一个 int 位字段,或者它们的带符号或
无符号变量或具有枚举类型的对象可能是
用于表达式中任何可以使用 int 或 unsigned int 的地方。如果
int可以表示原始类型的所有值,其值为
转换为 int;
令人惊讶的是 s?s:s 因为我能找到的所有参考资料都说结果类型是左值,但这只是 C++。 C 将其视为右值。正如预期的那样,C++ 的输出是:
2 4 2
即使表达式是右值。 C 和 C++ 之间的一个意想不到的差异。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)