为什么我得到不同的结果当我应用sizeof运算符
Why do I get different results when I apply sizeof operator?
我有这个程序
#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操作符或一元&的操作数;操作符,或为a用于初始化数组的字符串字面值,类型为" array of type "的表达式为转换为类型为"指向类型的指针"的表达式,该指针指向的初始元素
相关文章:
- 没有运算符"="与这些操作数匹配,JUCE 窗口演示应用程序
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 应用于运算符而不是构造函数的显式关键字
- 应用于无符号类型的一元减号运算符
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 这些重载运算符如何应用于表达式 d***b?
- [expr.unary.op]/9 似乎暗示"运算符!()' 不能应用于下面的类型 A.但编译器不同意这一点
- C++ 带有 While 运算符的控制台应用程序
- 应用指针相关运算符时隐式转换为指针类型
- 如何将比较运算符应用于两个匿名结构中的每个变量
- 将运算符重写应用于具有动态分配指针的类
- 二元运算符"<<"不能应用于类型 "wostream" 和 "string" 的表达式
- 如何将可编辑的预定义字符串写入 C++ 控制台应用程序中的 cin 输入运算符
- 错误 一元减号运算符应用于无符号类型会导致无符号
- 将或(||)运算符应用于只有0和1的两个向量
- MSVS 2015 显式错误 C4146 - 应用于无符号类型的一元减号运算符
- 如何将 decltype 应用于运算符 [] 声明中的成员函数
- 我对指针/引用中C++"&"运算符的不一致应用感到困惑?
- 错误 C4146:一元减号运算符应用于无符号类型,结果仍然无符号
- Android OpenCV - 在矩阵上应用数学运算符