Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ ISO C中数组的左值到右值转换_C++_C_Visual Studio 2008_Language Lawyer_Lvalue To Rvalue - Fatal编程技术网

C++ ISO C中数组的左值到右值转换

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++ANSI ISO 14882 2003附录C.1(第668页):

更改:条件表达式、赋值表达式或逗号表达式的结果可能为左值
理由: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集成吗?我闻到了一个新的线索:)