arrays - C 中 sizeof() 运算符中 "comma"运算符的行为

标签 arrays c sizeof c11 comma-operator

<分区>

我写了关于 sizeof 运算符的代码。如果我这样写:

#include <stdio.h>

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

输出:

20 // Ok, it's fine

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

#include <stdio.h>

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

输出:

8 // Why the output 8?

所以,我有一个问题:

  • 为什么编译器在第二个例子中给出输出 8
  • comma 运算符转换为 sizeof() 运算符的行为是什么?

最佳答案

逗号运算符对 sizeof 没有特殊意义。

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

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

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

关于arrays - C 中 sizeof() 运算符中 "comma"运算符的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807113/

相关文章:

c - OSX FSEventStreamEventFlags 无法正常工作

c++ - 如何根据内容确定文本文件的大小

c++ - size_t 和 sizeof 不一致

arrays - MongoDB 聚合 - 嵌套数组的总和值

java - 将 Java 数组分配给非数组属性 - 可序列化

具有两个数组的 Java 到 Mips

c - 从 K&R 书中解释 free 的实现

c - 代码库的哪些部分使二进制文件变大?

C++Builder 2007, union 和位字段

java - 数组项至少等于另一个数组中的一项