“的行为;逗号;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?