表达式 a<=20?b=30:c=30; 怎么写?这样 30 只使用一次?

How to write the expression a<=20?b=30:c=30; such that 30 is used only once?

我正在看一本关于 c 编程的书,遇到了这个例子:

a<=20?b=30:c=30;

我只需要用一次数字 30。书中的解决方案是

((a<=20)?&b:&c)=30);

当我尝试 运行 时,出现以下错误:

lvalue required as left operand of assignment.

好像少了一个括号,但我不知道在哪里。

你能告诉我如何解决这个问题吗?

假设 ab 是同一类型的数字,只需

*((a <= 20) ? &b : &c) = 30;

获取 ab 地址需要取消引用('*')以获得 左值

来自@Vrintle 的注释,你也可以用 C++ 做

((a<=20)?b:c)=30;

编译器知道形式是 lvalue 所以 bc 的值未使用但它们的参考

It seems like one of the parenthesis is missing there, but I don't know where.

((a<=20)?&b:&c)=30);最后一个')'没有对应的'('

对于 C 中的初学者,这个表达式

a<=20?b=30:c=30

等同于

( a<=20?b=30:c ) = 30

并且编译器会报错,因为赋值的左操作数不是左值。

你必须写

a <= 20 ? b = 30 : ( c = 30 )

或为了对称

a <= 20 ? ( b = 30 ) : ( c = 30 )

你的意思如下

*(a <= 20 ? &b : &c ) = 30;

在C语言中,通过指向对象的指针间接获取对象引用是一种技巧。指针本身是右值但取消引用它你得到指向对象的左值。

在 C++ 中你可以简单地编写

( a <= 20 ? b : c ) = 30;

因为在这种情况下运算符 returns 左值。

C和C++在条件运算符的语法定义上存在差异。

在 C 中定义为 (6.5.15 条件运算符)

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

在 C++ 中(C++ 14、5.16 条件运算符)

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

所以在C++中,未经C编译器编译的原始表达式是有效的

a <= 20 ? b = 30 : c = 30