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标准,看是否对这种情况有规定。

posted @ 2008-09-21 01:28  中土  阅读(629)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.