C++ ISO C中数组的左值到右值转换
C++ANSI ISO 14882 2003附录C.1(第668页): 更改:条件表达式、赋值表达式或逗号表达式的结果可能为左值C++ ISO C中数组的左值到右值转换,c++,c,visual-studio-2008,language-lawyer,lvalue-to-rvalue,C++,C,Visual Studio 2008,Language Lawyer,Lvalue To Rvalue,C++ANSI ISO 14882 2003附录C.1(第668页): 更改:条件表达式、赋值表达式或逗号表达式的结果可能为左值 理由:C++是一种面向对象的语言,相对而言更强调左值。例如,函数可能返回左值。 对原始特征的影响:更改定义良好的特征的语义。一些隐式依赖左值到右值转换的C表达式将产生不同的结果。比如说, char arr[100]; sizeof(0, arr) 在C++中生成100,在C++中生成sizeof(char*)。 我今天刚刚读到这篇文章,我记得我的一个朋友的几个月里
理由:C++是一种面向对象的语言,相对而言更强调左值。例如,函数可能返回左值。
对原始特征的影响:更改定义良好的特征的语义。一些隐式依赖左值到右值转换的C表达式将产生不同的结果。比如说,
char arr[100];
sizeof(0, arr)
在C++中生成100,在C++中生成sizeof(char*)。我今天刚刚读到这篇文章,我记得我的一个朋友的几个月里提出一个问题,如果写一个函数,它将返回0,如果它是用C++编译的,1是用C编译的。因此,考虑到这一新信息,我决定这将是上述问题的另一种解决方案,我尝试在微软Visual Studio 2008上进行,但是不管它是编译为C还是C++代码<代码> siZeof(0,ARR)< /C>总是产生4。因此,有两个问题: 1.什么是ISO C?它是当前的C标准吗?它是唯一一个(我听说C正在迅速发展) 2.这是微软C++的bug吗?< /P> 短暂性脑缺血发作 编辑:抱歉把输出弄混了,编辑了它:ISO C是C标准。目前的是C99,但C1x就在拐角处。如果说快速,你指的是每十年左右制定一个新标准,那么是的,它正在快速发展:-) ISO C99第6.5.3.4/3节规定: 应用于具有char、unsigned char或signed char(或其限定版本)类型的操作数时,结果为1 应用于具有数组类型的操作数时,结果是数组中的总字节数。
对于数组,
sizeof
返回总大小。小心作为指针传递的数组
C99标准:
应用于具有数组的操作数时
类型,则结果是数组中的总字节数
或者只是微软的C不是ISO C,而是其他一些标准C(如果有的话)
Microsoft Visual C仍然[仅]支持C89,而gcc/clang等其他编译器也支持C89,这是当前的标准
C99[章节6.5.17/2
]中说
逗号运算符的左操作数作为空表达式计算;评估后有一个序列点。然后计算右操作数;结果有其类型和值。95
因此sizeof(0,arr)
的结果将是sizeof(char*)
[由于隐式lvalue
到rvalue
转换/自动衰减到指针类型]而不是100*sizeof(char)
sizeof(arr)
将从6.5.3.4/3
95)逗号运算符不会产生左值
判定这将是解决上述问题的另一个解决方案,我在微软Visual Studio 2008上尝试过,但是不管它是否被编译为C或C++代码SIZEOF(0,ARR)总是产生4。 C++03[
5.18/1
]逗号运算符
类型和
结果的值是右操作数的类型和值;如果右操作数为,则结果为左值
所以sizeof(0,arr)=sizeof(arr)
这将等于100*sizeof(char)
而不是=sizeof(char*)
> MSVC++给出错误结果(在C++代码的情况下)。使用MSVC 2010,<代码> siZeof(0,ARR)< /代码>似乎被评估为<代码> 4 (编译为C++)。用g++,它评估为<代码> 100 > /Cord> @ Prasoon:95是指C或C++?@ AMAN:<代码> C99 < /代码>……为我清楚地编辑了我的帖子。有时我想知道为什么我仍然使用MSVC。但是他们有一个很棒的IDE…@Armen:是的,对!但是编译器已经坏了,还没有C99支持。糟糕!糟糕!糟糕<代码>:(@Prasoon:他们的编译器无疑是可怕的(从学究的角度来看),但他们的IDE是最好的。一个自然的问题出现了……难道不可能将Comeau或g++编译器与MSVS IDE集成吗?我闻到了一个新的线索:)