问题描述
我正在关注一本有关c编程的书,并遇到了以下示例:
a<=20?b=30:c=30;
我只需要使用30号。书中的解决方案是
((a<=20)?&b:&c)=30);
当我尝试运行此程序时,出现以下错误:
需要左值作为赋值的左操作数。
似乎其中缺少一个括号,但我不知道在哪里。
您能告诉我如何解决此问题吗?
解决方法
假设 a 和 b 是相同类型的数字,只要做
*((a <= 20) ? &b : &c) = 30;
获取 a 和 b 地址需要取消引用(“ *”)以具有 lvalue
来自@Vrintle的备注说明,您也可以在C ++中完成
((a<=20)?b:c)=30;
编译器知道格式为 lvalue ,因此未使用 b 和 c 的值,但使用了它们的引用
似乎其中缺少一个括号,但我不知道在哪里。
在((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
在C语言中获取对对象的引用是一种技巧,它是通过指向对象的指针间接获得的。指针本身是右值,但取消引用它可以得到指向对象的左值。
在C ++中,您可以编写简单
( a <= 20 ? b : c ) = 30;
因为在这种情况下,运算符返回左值。
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