【问题标题】:Post-increment operator in CC中的后增量运算符
【发布时间】:2013-05-19 13:05:09
【问题描述】:

我写这段 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。

标签: c post-increment


【解决方案1】:

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

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

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

【讨论】:

  • 我不关心 sizeof() 返回什么。我担心最终的prinf()。在后增量之后,我希望 x 的值为 11。但是对于 sizeof() 的示例,它仍然有 10 作为最终值。但是当我用另一个函数替换 sizeof() 时,x 的最终值为 11。这是我关心的问题。
  • 仍然回答你的问题。 sizeof(i++) 被预处理器/编译器替换为 4,因此 i++ 永远不会在可执行文件中作为机器代码结束。
  • @user2290802 这就是我所说的,sizeof() 不是运行时函数。在编译时,它只看到参数的大小并将该数字插入它的位置(有点)。在运行时 i++ 甚至不存在,因此它不求值。
【解决方案2】:

sizeof 不计算其操作数(VLA 类型的情况除外)。

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

【讨论】:

  • +1 这是正确答案。在 C99 标准中,这是第 6.5.3.4 节要点 2。
猜你喜欢
  • 2012-10-17
  • 2011-12-21
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多