C++ 为什么应用sizeof运算符时会得到不同的结果?
我有这个节目C++ 为什么应用sizeof运算符时会得到不同的结果?,c++,c,arrays,sizeof,C++,C,Arrays,Sizeof,我有这个节目 #include <stdio.h> int main() { char arr[100]; printf("%d", (int)sizeof(0,arr)); } #包括 int main() { char-arr[100]; printf(“%d”,(int)sizeof(0,arr)); } 打印为C文件时打印4,并将100打印为C++文件。为什么?我使用的是gcc。在C中,逗号运算符右侧操作数的结果具有类型和值。在C语言中,逗号运算符不会产生左值
#include <stdio.h>
int main()
{
char arr[100];
printf("%d", (int)sizeof(0,arr));
}
#包括
int main()
{
char-arr[100];
printf(“%d”,(int)sizeof(0,arr));
}
打印为C文件时打印4,并将100打印为C++文件。为什么?我使用的是gcc。
在C中,逗号运算符右侧操作数的结果具有类型和值。在C语言中,逗号运算符不会产生左值。所以存在一个从左值到右值的转换,导致数组类型衰减为指针类型。因此,在C中,您得到的是sizeof(char*)
的结果
在C++中,逗号表达式的结果是一个LValk。没有这种转换[如在C中],您得到的是sizeof(arr)
即100sizeof
是一个运算符而不是一个函数
因此,您正在执行逗号运算符,它返回正确的操作数作为其结果
在C++中,这是一个引用,所以它仍然是一个数组,并且具有完整的大小。
在C语言中,在一个表达式(任何带有运算符的东西)中,通常x的类型数组
被转换为指向x的指针。但是对于两个操作符有一个特殊的例外:sizeof
和&
因此,sizeof
是否首先到达那里很重要,因为转换规则有一个例外。(见C99第6.3.2.1节†)
你可以看到另一种方法,程序在C和C++中返回相同的东西。
#include <stdio.h>
int main(void) {
char arr[100];
printf("%d\n", (int)sizeof arr);
printf("%d\n", (int)sizeof(arr + 0));
return 0;
}
†6.3.2.1(3)除非它是sizeof运算符或一元&运算符的操作数,或是
字符串文字用于初始化数组,类型为“”的数组类型“”的表达式为
已转换为类型为“指向类型的指针”且指向的初始元素的表达式
数组对象,不是左值。请注意,使用逗号运算符的唯一原因是产生求值的副作用,但不会求值sizeof
操作的表达式。在C中,声明的数组每次都会衰减为指针,除非它显示为sizeof
的操作数或&
-运算符。在您的例子中,情况并非如此,因此它被转换为指针。在C++中,只需要转换数组。一个很好的例子,说明为什么用C++编译器编译C是一个误导的做法。使用逗号操作符(或者几乎以其他方式)是一个误导的做法。真正的问题是“这是一个非常甜蜜的回答。”我不知道C中存在行为。即使逗号运算符在C中产生左值,它仍然会打印100
。因为在本例中,逗号运算符的右操作数是非左值的char*
。是的,数组衰减规则指定只要使用数组名,就会发生这种衰减,除非作为&
或sizeof
的操作数。因为它被用作,
(逗号运算符)的操作数,所以它已经衰减了,不管,
是否保留左值。答案没有解释为什么直接应用sizeof
时C中的结果不同,因为这也是一个表达式。解释是:sizeof
的转换规则中有一个特定的例外。C++中不存在这个异常,这无疑是因为转换规则不同。“C++中的引用”——你的意思是“这是一个左值”;表达式从来没有引用类型
100
8