Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的行为;逗号;sizeof()中的运算符C中的运算符_C_Arrays_Sizeof_Comma_C11 - Fatal编程技术网

“的行为;逗号;sizeof()中的运算符C中的运算符

“的行为;逗号;sizeof()中的运算符C中的运算符,c,arrays,sizeof,comma,c11,C,Arrays,Sizeof,Comma,C11,我写了关于sizeof操作符的代码。如果我写下这样的话: #include <stdio.h> int main() { char a[20]; printf("%zu\n", sizeof(a)); return 0; } 但是,如果我像这样使用逗号运算符: #include <stdio.h> int main() { char a[20]; char b; printf("%zu\n", sizeof(b, a)

我写了关于
sizeof
操作符的代码。如果我写下这样的话:

#include <stdio.h>

int main() {
    char a[20];
    printf("%zu\n", sizeof(a));
    return 0;
}
但是,如果我像这样使用逗号运算符:

#include <stdio.h>

int main() {
    char a[20];
    char b;
    printf("%zu\n", sizeof(b, a));
    return 0;
}
因此,我有一个问题:

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

在大多数情况下,数组会衰减为指针。因此带有逗号运算符的
b的类型是
char*
(不再是
char[20]
)。指针是机器上的8个字节

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


(我发现这是C和C++之间的一个棘手的区别;参见)

< P> >逗号运算符对< < >代码> > > > > >
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
根据其操作数的类型确定大小。在
sizeof(a)
中,
a
不会衰减为指向其第一个元素的指针,并且
a
的类型将为
char[20]
。在
sizeof(b,a)
中,
a
是逗号运算符的右操作数,在此上下文中,它将衰减为指向其第一个元素的指针,表达式
b的类型,a
将是
char*
。因此,
sizeof(b,a)
将返回
char*
数据类型的大小

在C++中, >, >运算符的结果是一个LValk(与C不同,它产生一个R值)。在这种情况下,
sizeof(b,a)
将返回数组的大小
a

C语言是一种左值丢弃语言。C中的逗号运算符不产生左值,也不保留数组的“arraynes”。这意味着,当右侧操作数是数组时,它将立即进行数组到指针的转换。因此,在C中,逗号运算符的结果是一个类型为
char*
的右值。这就是您应用
sizeof
的目的。这就是为什么结果是
8
,这是平台上的指针大小


C++语言是一种保留左值的语言。C++中逗号运算符的右操作数不受LValueto rValf转换的影响,如果操作数是数组,则保持其Lualess及其数组类型。在C++中,逗号运算符的结果是一个值类型:<代码> char(20)< /代码>。这就是您应用
sizeof
的目的。这就是为什么结果是
20

参考文献为C116.3.2.1/3:“除非它是
sizeof
运算符的操作数、
\u Alignof
运算符或一元
&
运算符,或者是用于初始化数组的字符串文字,类型为“类型的数组”的表达式转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值。“这是一个不可靠的问题,但事实上,
b
a
的计算之间存在逗号运算符和序列点,这可能会导致与参考C11 6.5.17/2逗号运算符冲突。我不知道答案,但如果将
b
计算为注入序列点的空指针,
a
似乎会转换为指针。@DavidC.Rankin既不计算b也不计算a,因为它们是sizeof操作数的一部分。序列点与此无关C11 6.5.17/3表示逗号运算符不能作为函数的参数出现。现在
sizeof
本身并不是一个函数。我在这里一定听从你的解释。我不知道,但我想确保我清楚地理解——以及相互竞争的评论和答案——我不知道:(我所能做的就是阅读,标准上说“逗号运算符的左操作数作为空表达式求值”…“然后对右操作数求值;”“这个解释”你为什么不投票关闭呢?
sizeof(b,a)
检查完整的表达式
b,a
…从技术上讲,
sizeof(b,a)
检查完整的表达式
(b,a)
。但有趣且令人困惑的是,
sizeof((a))
仍然会产生一个值
20
sizeof(b,a)检查完整的表达式b,a
我认为括号是首先计算的,然后sizeof将计算结果。不是吗?@Michi括号(在本文中)不是operator@M.M我从来没有说过:)。我说的是在这些括号内发生的事情,这是第一次计算,并且只有在SIZEOF计算结果之后。或者我错了。True-
sizeof(b,a)
计算表达式
(b,a)
的结果大小。语法上
sizeof(int)#include <stdio.h>

int main() {
    char a[20];
    char b;
    printf("%zu\n", sizeof(b, a));
    return 0;
}
8 // Why the output 8?