第一题
1.sizeof操作符题目
下面代码的结果是:
#include <stdio.h>
int i;
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
打印为:>
2.解析
- int i; ----为全局变量且没有初始值
没有初始值的全局变量,编译器会默认将其初始化为0。
所以i - - 的值为-1 - sizeof是一个操作符,计算计算机类型/变量所占内存空间的大小。
i 是有符号的整型类型,所以sizeof(i) = 4 - sizeof的返回值类型实际为无符号整形
所以 i - - 与sizeof(i) 比较大小时,会将 i - - 的值自动转换为无符号整型进行比较
i - - = -1;无符号整型的 -1 为2的32次方,是无符号整型的最大值,故肯定比4大
所以 i - - > sizeof(i)
第二题
1.优先级题目
下面代码的结果是:
#include <stdio.h>
int main()
{
int i = 1;
int ret = (++i)+(++i)+(++i);
printf("ret = %d\n", ret);
return 0;
}
答案为:程序错误
2.解析
-
表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径
-
所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式
计算顺序1:
i =(++i)+(++i)=5, i+(++i)=6+6=12(先++,把6赋给i,在相加)
计算顺序2:
(++i)=2(++i)=3(++i)=4, 2+3+4=9
- 但可以在VS和Linux gcc测试,结果可能有差异。
例如:在VS编译器上测试结果为12