为什么应用 sizeof 运算符时会得到不同的结果?
我有这个程序,
#include <stdio.h>
int main()
{
char arr[100];
printf("%d", (int)sizeof(0,arr));
}
编译为 C 文件时打印 4,编译为 C++ 文件时打印 100。为什么?我正在使用海湾合作委员会。
I have this program
#include <stdio.h>
int main()
{
char arr[100];
printf("%d", (int)sizeof(0,arr));
}
This prints 4 when compiled as a C file and prints 100 as a C++ file. Why? I am using gcc.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 C 中,逗号运算符右侧操作数的结果具有类型和值。在 C 中,逗号运算符不会产生左值。因此,存在左值到右值的转换,导致数组类型衰减为指针类型。因此,在 C 中,您得到的是
sizeof(char*)
的结果。在 C++ 中,逗号表达式的结果是左值。没有这样的转换[如 C],你得到的是
sizeof(arr)
即 100In C the result of the right hand operand of the comma operator has a type and value. In C a comma operator does not yield an lvalue. So there is an lvalue to rvalue conversion resulting in decay of array type to pointer type. So in C what you get is the result of
sizeof(char*)
.In C++ the result of a comma expression is an lvalue. There is no such conversion[as in C] and what you get is the
sizeof(arr)
i.e 100sizeof
是一个运算符而不是函数因此,您正在执行逗号运算符,它返回正确的操作数作为其结果。
在 C++ 中,这是一个引用,因此它仍然是一个数组并且具有完整的大小。
在 C 语言中,在表达式(带有运算符的任何内容)中,通常 x 的数组类型会转换为指向 x 的指针。但两个运算符有一个特定的例外:
sizeof
和&
。因此,由于转换规则的例外,
sizeof
是否先到达那里很重要。 (参见 C99 第 6.3.2.1 节。†)您可以用另一种方式看待这一点,这里程序在 C 和 C++ 中返回相同的内容。
我的 Mac 上的结果:
† 6.3.2.1(3) 除非它是 sizeof 运算符或一元 & 的操作数。运算符,或者是一个
用于初始化数组的字符串文字,类型为“array of type”的表达式是
转换为类型为“指向 type”的表达式,该指针指向 的初始元素
数组对象,不是左值。
sizeof
is an operator not a functionSo, you are executing the comma operator, which returns the right operand as its result.
In C++, this is a reference, so it's still an array and has its full size.
In C, in an expression (anything with an operator) normally the type
array of x
is converted topointer to x
. But there is a specific exception for two operators:sizeof
and&
.So it matters if
sizeof
gets there first or not, because of the exception to the conversion rules. (See C99 section 6.3.2.1.†)You can see this another way, and here the program returns the same thing in C and C++.
result on my Mac:
† 6.3.2.1(3) Except when it is the operand of the sizeof operator or the unary & operator, or is a
string literal used to initialize an array, an expression that has type ‘‘array of type’’ is
converted to an expression with type ‘‘pointer to type’’ that points to the initial element of
the array object and is not an lvalue.