sizeof()运算符中"逗号"运算符的行为

msc*_*msc 12 c arrays sizeof comma c11

我写了关于sizeof运算符的代码.如果我写的东西如下:

#include <stdio.h>

int main() {
    char a[20];
    printf("%zu\n", sizeof(a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

20 // Ok, it's fine
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用这样的逗号运算符:

#include <stdio.h>

int main() {
    char a[20];
    char b;
    printf("%zu\n", sizeof(b, a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

8 // Why the output 8?
Run Code Online (Sandbox Code Playgroud)

所以,我有一个问题:

  • 为什么编译器8在第二个例子中提供输出?
  • comma运营sizeof()商对运营商的行为是什么?

Pet*_*ter 12

逗号运算符没有特殊含义sizeof.

sizeof(b, a) 检查完整的表达式(b, a),计算出结果类型,并计算该类型的大小而不进行实际评估(b , a).正如chqrlie在注释中所指出的那样,它()是表达式(评估结果的大小)的一部分.

在这种情况下,b是一个char并且a是一个数组.如果b, a要评估表达式,b将首先评估表达式,结果将被丢弃.然后a转换为指针(char *),其值等于&a[0]表达式的结果(b, a).

由于b, a类型的结果char *, sizeof(b,a)等于sizeof (char *).这是一个实现定义的值,但对于您的编译器,其值为8 (这可能意味着代码是作为64位应用程序构建的).

  • *`sizeof(b,a)`检查完整的表达式`b,a`*...从技术上讲,`sizeof(b,a)`检查完整的表达式`(b,a)`.但有趣且令人困惑的是,`sizeof((a))`仍然会产生一个'20`的值. (3认同)

Bas*_*tch 11

在大多数情况下,数组会衰减为指针.所以b,a 带逗号运算符的类型是char*(不再是char[20]).并且指针在您的计算机上是8个字节.

顺便说一下,我认为sizeof在一些逗号操作符上使用对读者来说真的很困惑.我建议sizeof在简单表达式或类型上使用.

(我刚刚发现这是C和C++之间的一个棘手的差异;请参阅此解释)

  • 参考是C11 6.3.2.1/3:"除非它是`sizeof`运算符的操作数,`_Alignof`运算符,或一元`&`运算符,或者是用于初始化数组的字符串文字,表达式具有类型''数组类型''的类型被转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素而不是左值." (3认同)
  • @ DavidC.Rankin既不是b也不是a被评估,因为它们是sizeof操作数的一部分.序列点与此无关 (3认同)