C - 在一行中对同一变量进行多次赋值

C - Multiple assignments to same variable in one line

我在 C:

中看到了这一行代码
#define RUNDE(n) ( K ^= Q[n], y = K, K = F(K) ^ xR, xR = y )

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

这是 well-defined,因为逗号运算符先计算第一个操作数,然后计算第二个操作数。

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

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

但无论哪种情况,您的表达都是完美的 well-defined。逗号运算符(从左到右计算)充当顺序表达式分隔符。

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

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

Is it valid to assign something to K multiple times?

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

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

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


I thought it's invalid to change a variable more than one time in one statement.

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

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

这是一个有效的逗号运算符,它按顺序执行所有语句,return计算最后一条语句的值。

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