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

Why do I get different results when I apply sizeof operator?

本文关键字:应用 运算符 结果 sizeof 为什么      更新时间:2023-10-16

我有这个程序

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

在编译为C文件时打印4,在编译为c++文件时打印100。为什么?

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

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

sizeof是操作符而不是函数

因此,您正在执行逗号操作符,该操作符返回正确的操作数作为其结果。

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

在C语言中,在表达式(任何带有操作符的表达式)中,通常将类型array of x转换为pointer to x。但是对于sizeof&这两个操作符有一个特殊的例外。

所以sizeof是否先到达很重要,因为转换规则有例外。

你可以从另一个角度来看,这里的程序在C和c++中返回相同的东西。

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

结果在我的Mac:

100
8

†6.3.2.1(3)除非它是sizeof操作符或一元&amp的操作数;操作符,或为a用于初始化数组的字符串字面值,类型为" array of type "的表达式为转换为类型为"指向类型的指针"的表达式,该指针指向的初始元素