gpt4 book ai didi

C 逗号运算符

转载 作者:太空狗 更新时间:2023-10-29 16:33:19 25 4
gpt4 key购买 nike

为什么在逗号运算符内指定的表达式(例如下面的示例)不被视为常量表达式?

例如,

int a = (10,20) ;

在全局范围内给出时会产生错误“initializer is not a constant”,尽管由逗号运算符分隔的两个表达式都是常量(常量表达式)。为什么不将整个表达式视为常量表达式?为了澄清,我已经阅读了What does the ‘,’ operator do in C?Uses of C comma operator .他们没有处理逗号运算符的这一方面。

最佳答案

ISO C99 标准的 6.6/3 部分“常量表达式”是您需要的部分。它指出:

Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within a subexpression that is not evaluated.

在 ISO 的 C99 基本原理文档中,有这个小片段:

An integer constant expression must involve only numbers knowable at translation time, and operators with no side effects.

而且,如果您不依赖于副作用,那么使用逗号运算符根本没有意义,因此它在常量表达式中毫无用处。

我的意思是,这两个代码段之间绝对没有区别:

while (10, 1) { ... }
while (1) { ... }

因为 10 实际上没有任何事情。事实上,

10;

是一个完全有效但不是很有用的 C 语句,大多数人在更好地了解该语言之前不会理解这一点。

但是,这两种说法之间是有区别的:

while (  10, 1) { ... }
while (x=10, 1) { ... }

后面使用逗号运算符会产生一个副作用,即会将变量 x 设置为 10

至于为什么他们不喜欢常量表达式中的副作用,常量表达式的全部意义在于它们可以在编译时求值而不需要执行环境——ISO 区分了翻译(编译时)和执行(运行时)环境。

关于为什么 ISO 决定不要求编译器提供执行环境信息(头文件中包含的内容除外,例如 limits.h)的线索可以稍后在基本原理文档中找到:

However, while implementations are certainly permitted to produce exactly the same result in translation and execution environments, requiring this was deemed to be an intolerable burden on many cross-compilers.

换句话说,ISO 不希望交叉编译器的制造商承担为每个可能的目标携带执行环境的负担。

关于C 逗号运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1737634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com