繁体   English   中英

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

[英]lvalue-to-rvalue conversion of an array in ISO C

C ++ ANSI ISO IEC 14882 2003附录C.1(第668页):

更改:条件表达式,赋值表达式或逗号表达式的结果可能是bean左值
理由:C + +是一种面向对象的语言,相对更重视左值。 例如,函数可以返回左值。
对原始特征的影响:改变定义明确的特征的语义。 隐式依赖左值到右值转换的某些C表达式将产生不同的结果。 例如,

char arr[100];
sizeof(0, arr)

在C ++中产生100,在C中产生sizeof(char*)
...

我今天正在读这篇文章,我记得几个月后,我的一个朋友提出了一个问题,即编写一个函数,如果用C ++编译将返回0,如果用C编译则返回1.我解决了它利用了这样一个事实,即在一个结构中,结构是在外部范围内。 因此,考虑到这些新信息,我决定这将是上述问题的另一种解决方案,我在Microsoft Visual Studio 2008上尝试过,但不管它是编译为C还是C ++代码sizeof(0, arr)总是产生4那么2个问题:

1.什么是ISO C? 它是目前的C标准吗? 它是唯一的一个(我听说C正在迅速发展)2。这是一个微软的C ++漏洞吗?

TIA

编辑:抱歉与输出混淆并编辑它:

ISO C C标准。 目前的一个是C99,但C1x就在附近。 如果快速,你的意思是每十年左右一个新标准,那么是的,它正在迅速发展:-)

ISO C99第6.5.3.4/3节规定:

当应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1。

当应用于具有数组类型的操作数时,结果是数组中的总字节数。

或者只是微软的C不是ISO C,而是一些其他标准C(如果有的话)。

Microsoft Visual C仍支持C89 [only],而其他编译器如gcc / clang等也支持C99 ,这是当前的标准。

C99 [第6.5.17/2节]说

逗号运算符的左操作数被计算为void表达式; 评估后有一个序列点。 然后评估右操作数; 结果有它的类型和价值。 95

因此sizeof (0,arr)将是sizeof(char*) [由于rvalue转换的隐式lvalue rvalue /自动衰减到指针类型]而不是100*sizeof(char)

sizeof(arr)会从6.5.3.4/3给出100*sizeof(char)

95)逗号运算符不会产生左值。


决定这将是上述问题的另一种解决方案,我在Microsoft 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 ++代码)。

对于数组, sizeof返回总大小。 关注作为指针传递的数组。

C99标准:

当应用于具有数组类型的操作数时,结果是数组中的总字节数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM