首先来看一串代码
int main()
{
short s = 5;
int a = 10;
printf("%d\n", sizeof(s = a + 2));
printf("%d\n", s);
return 0;
}
执行后结果为2 5,s占2个字节,s的值为5,sizeof括号中表达式未参与运算,这是因为sizeof在编译时已经执行,而运算在运行编译后的exe可执行程序时执行。
test.c 编译 test.exe
源文件 执行sizeof 可执行程序
再看一串代码
int main()
{
char c = 1;
//%u是输出无符号整型unsigned int
printf("%u\n", sizeof(c));//1
printf("%u\n", sizeof(+c));//4
printf("%u\n", sizeof(-c));//4
printf("%u\n", sizeof(!c));
return 0;
}
在VS平台中执行结果为1 4 4 1,而在Linux平台使用gcc编译测试结果是1 4 4 4
其中,1是指char数据类型占1个字节,下面两个4是在进行编译时,由于运算符的存在,发生了整型提升,char字符类型提升为int整型,变成了4个字节,而最后一个sizeof(!c),按照C语言国际标准执行应该是4,而在VS编译器中执行结果为1。