Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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
C++ 为什么应用sizeof运算符时会得到不同的结果?_C++_C_Arrays_Sizeof - Fatal编程技术网

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)
即100

sizeof
是一个运算符而不是一个函数 因此,您正在执行逗号运算符,它返回正确的操作数作为其结果

在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