当我应用sizeof运算符时,为什么会得到不同的结果?

时间:2011-04-23 19:28:46

标签: c++ c arrays sizeof

我有这个程序

#include <stdio.h>
int main()
{
   char arr[100];
   printf("%d", (int)sizeof(0,arr));
}

当编译为C文件时打印4,并将100打印为C ++文件。为什么?我正在使用gcc。

2 个答案:

答案 0 :(得分:34)

在C中,逗号运算符的右手操作数的结果具有类型和。在C中,逗号运算符不会产生左值。因此,左值转换的左值导致数组类型衰减为指针类型。所以在C中你得到的是sizeof(char*)的结果。

在C ++中,逗号表达式的结果是左值。没有这样的转换[如在C中],你得到的是sizeof(arr),即100

答案 1 :(得分:3)

sizeof是运算符而不是函数

因此,您正在执行逗号运算符,该运算符返回右操作数作为结果。

在C ++中,这是一个引用,因此它仍然是一个数组,并且具有完整的大小。

在C中,在表达式(带有运算符的任何东西)中,通常将类型array of x转换为pointer to 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;
}

我Mac上的结果:

100
8

†6.3.2.1(3)除非它是sizeof运算符或一元&amp;的操作数。运营商,或者是 用于初始化数组的字符串文字,类型为“ type ”的数组的表达式是 转换为类型为''指向 type '的指针的表达式,指向的初始元素 数组对象并不是左值。