【发布时间】:2025-12-21 21:45:06
【问题描述】:
int a=2, b=22;
a>b?a:b=222;
这段代码给了我一个错误。我认为是因为条件运算符根据条件返回a或b的值,所以该值不能用作Lvalue。在我的例子中,22=222,所以这是一个错误。
int *i, *j, a=2,b=222;
i = &a;
j = &b;
a>b?i:j=&a;
在这种情况下编译器也会抛出错误。根据我的假设,和前一种情况一样,这里它返回一个值i 或j。所以 0x123 = &a; [令 0x123 为存储在 j 中的地址]。无效吗?
此时,我发了一个search。我尝试了0x123 = &a;,但编译器仍然抛出错误。我猜出于安全原因,编译器不允许我修改内存位置。
请让我知道我的所有假设都是有效的,并告诉我如果允许程序员操作内存位置会发生什么安全错误。我假设一个内存位置可能包含一个不应修改的值。
编辑
错误是error: lvalue required as left operand of assignment。
【问题讨论】:
-
提示,在使用
?:时,请随意使用括号。 -
不是“出于安全原因”,而是因为它没有任何意义。不,使用指针不会神奇地使 ?: 运算符产生左值。返回的指针仍然是一个或另一个表达式的临时副本。你可以做的是
*(*a > *b ? a : b) = 222,a 和 b 是指针。 -
谢谢海德。我知道如何克服这一点。我的疑问是为什么第二个代码无效
-
另外提示:如果要访问内存,需要指针包含地址,然后需要使用
*解引用指针。 -
你的代码 a>b?a:b=222;相当于 (a>b) 吗? a : (b=222);