【问题标题】:lvalue-to-rvalue conversion of an array in ISO CISO C中数组的左值到右值转换
【发布时间】:2010-10-17 12:15:07
【问题描述】:

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 .我利用在C中结构位于外部范围内这一事实解决了它。因此,考虑到这些新信息,我决定这将是上述问题的另一种解决方案,我在 Microsoft Visual Studio 2008 上尝试过,但无论是编译为 C 还是 C++ 代码sizeof(0, arr) 总是产生 4。所以 2问题:

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

TIA

编辑:抱歉弄混了输出并进行了编辑:

【问题讨论】:

  • 在 MSVC 2010 中,sizeof(0, arr) 的计算结果似乎为 4(编译为 C++ 时)。使用 g++,它的计算结果为 100

标签: c++ c visual-studio-2008 language-lawyer lvalue-to-rvalue


【解决方案1】:

ISO C 是 C 标准。当前是 C99,但 C1x 指日可待。如果说快速,您的意思是每十年左右就有一个新标准,那么是的,它正在迅速发展:-)

ISO C99 第 6.5.3.4/3 节规定:

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

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

【讨论】:

    【解决方案2】:

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

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

    C99 [Section 6.5.17/2] 说

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

    因此sizeof (0,arr) 的结果将是sizeof(char*)[由于隐式lvaluervalue 的转换/自动衰减到指针类型] 而不是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++ 代码的情况下)。

    【讨论】:

    • @Prasoon: 95) 是指 C 还是 C++?
    • @Armen : C99 [..] 为清晰起见编辑了我的帖子。
    • 有时我想知道为什么我还在使用 MSVC。但是他们有一个很棒的 IDE...
    • @Armen :对!但是编译器坏了,还没有 C99 支持。坏的!坏的!坏的! :(
    • @Prasoon:他们的编译器无疑是可怕的(从迂腐的角度来看),但他们的 IDE 是最好的。一个自然的问题出现了……难道不能将 Comeau 或 g++ 编译器与 MSVS IDE 集成吗?我闻到了一个新线程:)
    【解决方案3】:

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

    C99 标准:

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

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2017-11-24
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2021-07-01
      • 2020-09-19
      相关资源
      最近更新 更多