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计算最后一条语句的值。
该宏是一系列赋值,使用最后一个赋值(y
或xR
)作为return值
我在 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计算最后一条语句的值。
该宏是一系列赋值,使用最后一个赋值(y
或xR
)作为return值