如何解决如何写表达式a <= 20?b = 30:c = 30;这样30只使用一次?
我正在关注一本有关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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。