C语言中的后增运算符

4

我在随意编码时写下了这段 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

我对这个结果感到困惑,因为我以为在sizeof操作符内部的i++会使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

现在我越来越困惑了。

如果这是一个新手问题(我就是),对不起,但我真的不明白如何在谷歌上搜索这样的问题!

为什么在这两个程序中i的值不同?请帮忙解答!


@ring0 我正在Windows虚拟机上运行Ubuntu 12.04,使用gcc 4.6.3。 - user2290802
2个回答

5

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

所以在第一个示例中,您只是获取整数上后增量操作符的结果值(即整数)的大小... 4个字节。

在您的示例中,您只是打印了返回值为4的方法的返回值,然后变量递增,并打印11。


1
我不关心sizeof()返回的内容,我关心最终的prinf()。在后增操作之后,我期望x的值为11。但是在使用sizeof()的示例中,它仍然具有10作为最终值。但是当我用另一个函数替换sizeof()时,x的最终值为11。这就是我的关注点。 - user2290802
1
仍然回答了你的问题。sizeof(i++)被预处理器/编译器替换为4,因此i++永远不会成为可执行文件中的机器代码。 - user123
1
@user2290802,就像我所说的,sizeof()不是一个运行时函数。在编译时,它只看到参数的大小并将该数字插入其位置(类似于)。在运行时,i++甚至不存在,因此不会进行评估。 - Yochai Timmer

5

sizeof不对其操作数进行求值(除非是VLA类型的情况)。

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


1
+1 这是正确的答案。在 C99 标准中,这是第 6.5.3.4 条款 2。 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接