【问题标题】:Is array[x, y] a valid C expression?array[x, y] 是一个有效的 C 表达式吗?
【发布时间】:2021-01-16 06:20:25
【问题描述】:

当参考以下关于宏 https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC12 的文档时,我看到 array[x, y] 作为参数传递。它是有效的 C 表达式吗?如果有,它有什么作用?

【问题讨论】:

  • 是的,但它评估并丢弃x 并使用y 作为数组索引。
  • 它使用the comma operator 并且完全有效。我认为它最常用于混淆初学者。 :)
  • 比较:int n = x, y;.

标签: arrays c gcc


【解决方案1】:

请注意,documentation 中的相关代码正在讨论如何处理宏参数的细节:

实际参数中的括号必须平衡;括号内的逗号不会结束参数。但是,不需要括号或大括号来平衡,并且它们不会阻止逗号分隔参数。因此,

macro (array[x = y, x + 1])

将两个参数传递给宏:array[x = yx + 1]。如果您想提供array[x = y, x + 1] 作为参数,则必须将其写为array[(x = y, x + 1)],这相当于C 代码。

另外,请注意 GCC 版本 2.95 文档非常旧(可追溯到 1999)。这些天您通常不需要咨询。也就是说,这方面在此期间没有改变。

如 cmets 中所述,在宏的上下文之外,符号:

array[x = y, x + 1]

使用逗号运算符计算 LHS(赋值 x = y),然后使用 RHS(表达式 x + 1)作为数组的索引。如果没有一些具有副作用的语句(例如赋值或函数调用),则表示法毫无意义。然而,它的定义很好。并且逗号运算符的LHS和RHS的评估之间存在一个序列点,这在示例中很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多