【问题标题】:C - Multiple assignments to same variable in one lineC - 在一行中对同一变量进行多次赋值
【发布时间】:2016-01-14 12:46:48
【问题描述】:

我在 C 语言中遇到了这行代码:

#define RUNDE(n) ( K ^= Q[n], y = K, K = F(K) ^ xR, xR = y )

多次分配给 K 是否有效?我认为在一个语句中多次更改变量是无效的。

【问题讨论】:

  • C 或 C++。选择一个。
  • 逗号运算符是一个序列点,但实际上,您的链接无论如何都值得一读。
  • @Bathsheba :我可以看到我的评论的措辞如何使我认为这是未定义的行为(事实并非如此)。但我想指出的是,未定义的行为如何与序列点相关联,而不是与 OP 认为的语句相关联。

标签: c++ c coding-style


【解决方案1】:

给K多次赋值是否有效?

这是完全有效的 C 宏。此处使用逗号运算符,

使用, 运算符可以多次为变量赋值。

例如K = 20, K = 30; 这会将30 分配给K 覆盖20 的先前值。


我认为在一个语句中多次更改变量是无效的。

是的,如果我们尝试在同一个 C 语句中多次修改变量,则会导致未定义的行为,但这里首先 ,sequence point

所以保证只有在第一次赋值 (K = 20) 的所有副作用都发生后,我们才会第二次修改 K (K = 30)。

【讨论】:

    【解决方案2】:

    这是明确定义的,因为逗号运算符先计算其第一个操作数,然后再计算第二个操作数。

    但是,恕我直言,这段代码太可怕了,您不应该编写它。 inline 函数可以做这样的事情;使用预处理器只是滥用。当然,您需要将一些参数传递给内联函数,但这比依赖周围作用域中的名称要好得多。

    【讨论】:

      【解决方案3】:

      在 C++ 中,这会被认为是讨厌的;在 C 中这是允许的,因为对预处理器的依赖更为必要。

      但在任何一种情况下,你的表达都是完美定义的。逗号运算符(从左到右求值)充当序列表达式分隔符。

      这个宏的优雅之处在于它的值是xR = y的值,也就是y的最终值。

      但是这个宏的不优雅,例如使用不作为参数传递的变量名,可能超过了任何好处。我的倾向是把它装箱。

      【讨论】:

        【解决方案4】:

        它是一个有效的逗号操作符,按顺序执行所有语句,返回最后一条语句的值。

        该宏是一系列赋值,使用最后一个赋值(yxR)作为返回值

        【讨论】:

          猜你喜欢
          • 2020-08-27
          • 1970-01-01
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多