2013-05-19 48 views
4

当我写这个的C代码,我随口编码:后增量运算用C

#include <stdio.h> 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",sizeof(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

而且,当我跑的代码,结果我得到的是,

i : 10 
sizeof(i++) is: 4 
i : 10 

我百思不得其解通过这个结果,因为我期望i ++内的sizeof运算符增加i。但似乎不是。因此,出于好奇,我写了下面的程序:

#include <stdio.h> 
int add(int i) 
{ 
    int a = i + 2; 
    return 4; 
} 
int main() 
{ 
    int i; 
    i = 10; 
    printf("i : %d\n",i); 
    printf("sizeof(i++) is: %d\n",add(i++)); 
    printf("i : %d\n",i); 
    return 0; 
} 

这个程序,输出是:

i : 10 
sizeof(i++) is: 4 
i : 11 

现在我越来越困惑。

对不起,如果这是一个noob问题(我是),但我真的不明白,即使如何谷歌这样的问题!

为什么我在这两个程序中的价值不同?请帮忙!

+0

@ ring0我在Windows上运行gcc 4.6.3在Windows 12.04虚拟机之上。 – user2290802

回答

5

sizeof()不是运行时功能。它只是给你一个函数的变量的大小或返回值的大小。

所以在第一个例子中,你只是得到一个后置增量运算符的结果值的大小,该整数是一个整数... 4个字节。

在你的榜样,你只是打印您的方法,它返回4,然后变量递增的返回值,您打印11

+1

我不关心sizeof()返回的内容。我关注最后的prinf()。后增量后,我期望x的值为11.但与sizeof()的例子仍然有10作为最终值。但是当我用另一个函数替换sizeof()时,x的最终值是11.这是我的担心。 – user2290802

+1

仍然回答你的问题。预处理器/编译器将'sizeof(i ++)'替换为'4',所以'i ++'永远不会成为可执行文件中的机器代码。 –

+1

@ user2290802这就是我所说的,sizeof()不是一个运行时函数。在编译时它只看到参数的大小,并将该数字插入其位置(有点)。在运行时,i ++甚至不存在,所以它不评估。 –

5

sizeof不计算它的操作数(除VLA型的情况下)。

这意味着sizeof(*(T*)(NULL))sizeof(T)相同,并且完全有效。

+1

+1这是正确的答案。在C99标准中,这是第6.5.3.4项第2点。 – JeremyP