sizeof 再遇
看下面程序片段:
#include <stdio.h>
int main()
{
int a=255;
printf("%d\n", sizeof(++a));
printf("%d\n", a);
return 0;
}
结果:
4
255
这个是我们已经熟知的:sizeof是编译期求值,所以sizeof中表达式根本不计算,而是只需要知道此表达式的类型就可以得到值
再看:
#include <stdio.h>
char func()
{
return 1;
}
int main()
{
printf("%d", sizeof(func()));
return 0;
}
结果:
1
这个也很显然嘛,func()这个表达式的类型就是其返回值的类型,上述代码中即char
#include <stdio.h>
void func()
{
}
int main()
{
printf("%d", sizeof(func()));
return 0;
}
结果也是1
void 是C中特意加上的类型,如不指定具体类型,其大小当然就是1了。没有这个类型之前,我们表示最小的类型只能用char了,但是char这个类型的本意是字符类型,如果实际上你要表示的不是字符,而仅仅因为其大小是1而使用char类型,势必会引起混淆。这也是C为什么会新增一个void类型的原因了。
上面有个陷阱,咋一看,还以为sizeof去求值的是函数指针呢,其实是表达式的值。
再看我变成这样:
#include <stdio.h>
char func()
{
return 1;
}
int main()
{
printf("%d", sizeof(func));
return 0;
}
有人想,这下总该是理解成函数指针吧!那么你错了,这次它的结果还是1。等会告诉你原因。
再改一下:
#include <stdio.h>
char func()
{
return 1;
}
int main()
{
printf("%d", sizeof(&func));
return 0;
}
这次对了,终于顺利打印出结果4. 这次是评估出是函数指针了
思考一下: 为什么会出现这两个结果。C中不是规定,函数名和对函数名取地址都是函数指针类型吗?
你没错,可是我也不知道为什么。呵呵,卖关子了
这可能是编译期理解的问题了,因为这个时候本身就是会产生歧义的。gcc可能直接把函数名这个表达式认为表示函数,表达式的值也就是其返回类型了
这里做了个测试:
1. gcc编译器会得到结果 sizeof(func) 为1
2. 而MS的编译器却直接认为是非法的sizeof操作,编译通不过
所以不用过于纠缠语法上本身存在歧义的特殊情形。编译期会做不同的解释。
过些天查找下ISO C标准,看是否对这种情况有规定。