如何写表达式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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...