Ton*_*Lee 3 c expression sizeof
用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;
}
Run Code Online (Sandbox Code Playgroud)
产生输出
2 4 4
Run Code Online (Sandbox Code Playgroud)
我在期待
2 2 2
Run Code Online (Sandbox Code Playgroud)
或者可能
2 4 2
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我从K&R回忆起,任何小于int的整数表达式都会被提升为int.我在标准(C89)中找到了这个:
3.2.1.1字符和整数
char,short int或int位字段,或其有符号或无符号变量,或具有枚举类型的对象,可以在任何可以使用int或unsigned int的表达式中使用.如果int可以表示原始类型的所有值,则该值将转换为int;
令人惊讶的是s?s:s因为我能找到的所有引用都说结果类型是左值,但那只是C++.C将其视为右值.正如预期的那样,C++的输出是:
2 4 2
Run Code Online (Sandbox Code Playgroud)
即使表达式是右值.C和C++之间出乎意料的差异.
这是因为后两个sizeof操作数包含运算符.在C中,类型比执行操作之前int提升的类型窄int.所以s * s是和,int乘以一个int,产生一个int.
同样是short ? short : short为了升职int ? int : int.