【问题标题】:Why n++ not work when it is an argument for sizeof() function? [duplicate]当它是 sizeof() 函数的参数时,为什么 n++ 不起作用? [复制]
【发布时间】:2019-04-18 14:20:49
【问题描述】:
int main() {
    int n = 1;
    sizeof(n++);
    printf("%d",n);
    return 0;
}

这是我的代码的一部分。输出是1。但是为什么n没有加1呢?
我尝试了其他功能,但其他输出为 2。

【问题讨论】:

  • sizeof n++ 等同于 "sizeof type(n++)"(如果存在的话)。一个类型的大小无论它有什么值都不会改变:sizeof 42 == sizeof -3 == sizeof isalpha('x') == sizeof (int)

标签: c sizeof


【解决方案1】:

这是因为,sizeof 不是函数,它是编译时运算符,除非操作数是 VLA,否则不会在运行时计算操作数。

引用C11,第 6.5.3.4 章

[...] 如果操作数的类型是变长数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量。

补充一点为什么不需要对操作数求值,从操作数的语义来看,

[....] 大小由类型决定 操作数。 [...]

并且,操作数的类型在编译时是固定的并且是已知的(除非是 VLA),因此无论如何它都不需要评估操作数来执行它的工作。在您的情况下,由于 n 的类型为 int

 sizeof (n++);

一样
 sizeof (int);

【讨论】:

    【解决方案2】:

    sizeof 不是函数,而是运算符。

    sizeof(n++) 等价于sizeof n++,其中(因为nint)等价于sizeof (int)

    sizeof 只看其操作数的类型;它不计算表达式。

    (除非涉及到可变长度数组,但我们现在将忽略它。)

    【讨论】:

      【解决方案3】:

      因为sizeof 不是函数,而是运算符。它的论点没有副作用。

      【讨论】:

      • 大多数时候sizeof的操作数没有副作用。但是,在int n = 3; sizeof(int [n++]); printf("%d\n", n); 中,n 发生了变化,并打印了“4”。
      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2021-04-05
      • 2021-12-07
      相关资源
      最近更新 更多