sizeof C中的整数表达式

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)

为什么是这样?

Ton*_*Lee 7

我从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和C++之间的另一个细微差别是:`printf("%zd \n",sizeof('s'));`可以在C中打印`4`但在C++中始终为`1` . (2认同)

Jen*_*ens 5

这是因为后两个sizeof操作数包含运算符.在C中,类型比执行操作之前int提升的类型窄int.所以s * s是和,int乘以一个int,产生一个int.

同样是short ? short : short为了升职int ? int : int.