6

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

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

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

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

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

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

TIA

编辑:抱歉混淆了输出并对其进行了编辑:

4

3 回答 3

5

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

ISO C99 第 6.5.3.4/3 节规定:

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

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

于 2010-10-17T12:33:54.813 回答
1

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

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

C99 [部分6.5.17/2] 说

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

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

sizeof(arr)100*sizeof(char)6.5.3.4/3

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


决定这将是上述问题的另一种解决方案,我在 Microsoft Visual Studio 2008 上尝试过,但无论它是编译为 C 还是 C++ 代码 sizeof(0, arr) 总是产生 4。

C++03 [ 5.18/1] 逗号运算符

结果的类型和值是右操作数的类型和值;如果它的右操作数是,则结果是一个左值。

所以 sizeof(0, arr) = sizeof (arr)and which 将等于100* sizeof(char)而不是 = sizeof(char*)

所以 MSVC++ 给出了不正确的结果(在 C++ 代码的情况下)。

于 2010-10-17T12:35:08.633 回答
0

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

C99标准:

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

于 2010-10-17T12:33:59.930 回答