C 为什么我的条件运算符给我一个错误?

C 为什么我的条件运算符给我一个错误?,c,conditional-operator,C,Conditional Operator,这个代码给了我一个错误。我认为这是因为条件运算符根据条件返回a或b的值,因此该值不能用作Lvalue。在我的例子中,22=222,所以这是一个错误 int a=2, b=22; a>b?a:b=222; 在这种情况下,编译器也会抛出一个错误。根据我的假设,与前一种情况一样,这里它返回值i或j。所以0x123=&a;[设0x123是存储在j中的地址]。这是无效的吗 在这一点上,我做了一个决定。我尝试了0x123=&a,但编译器仍会抛出错误。我猜出于安全原因,编译器不允许我修改内存位置 请让

这个代码给了我一个错误。我认为这是因为条件运算符根据条件返回
a
b
的值,因此该值不能用作
Lvalue
。在我的例子中,22=222,所以这是一个错误

int a=2, b=22;
a>b?a:b=222;
在这种情况下,编译器也会抛出一个错误。根据我的假设,与前一种情况一样,这里它返回值
i
j
。所以0x123=&a;[设0x123是存储在j中的地址]。这是无效的吗

在这一点上,我做了一个决定。我尝试了
0x123=&a,但编译器仍会抛出错误。我猜出于安全原因,编译器不允许我修改内存位置

请让我知道我的所有假设都是有效的,并告诉我如果允许程序员操作内存位置,会发生什么安全错误。我假设内存位置可能包含不应修改的值

编辑
错误是
错误:赋值的左操作数需要左值

这是一个语法错误。使用地址没有问题:

int *i, *j, a=2,b=222;
i = &a;
j = &b;
a>b?i:j=&a;
在C++中,等价的生成(参见5.16-17):(强调添加)

<>在C++中,如果<代码>类型:这个操作符可能是合法的::操作符!(int)
返回一个引用:

int x;
-x = 3;  /* lhs is not an lvalue */

const int cx = 3;
cx = 4;  /* lhs is not modifiable */
我已经在GCC版本4.8.1中运行了上述代码 它工作得很好。 然后我把它改成了下面的内容,这将清除你的视野

int a=2, b=22;
a>b?a:b=222;
上面一行可以写成

a>b?a:b=222;

当我们运行它时,222首先被分配给变量b,然后执行?:运算符。

提示,在使用
?:
时,请随意使用括号。不是“出于安全原因”,而是因为它没有任何意义。不,使用指针并不能神奇地使?:运算符产生左值。返回的指针仍然是一个表达式或另一个表达式的临时副本。你能做的是
*(*a>*b?a:b)=222
,a和b是指针。谢谢海德。我知道如何克服这一点。我的疑问是为什么第二个代码无效另一个提示:如果你想访问内存,你需要一个包含地址的指针,然后你需要使用
*
取消对指针的引用。你的代码a>b?a:b=222;是否等同于(a>b)?a:(b=222);不,这不是语法错误。这是一个语义错误。OP尝试为运算符的返回值赋值。因为它是右值,所以连括号都不起作用。你能解释一下错误到底是什么吗?@TheParamagneticCroissant:由于语法错误,它永远不会出现语义错误。(但如果修复语法错误,则必须处理语义错误。)@user3801433?:运算符返回一个右值。这是一个未命名的临时文件,不指定存储。它不可能被分配给,因为它没有意义。同样,指针不是魔法。指针和其他任何东西一样都是正常值。如果返回指针,则无法分配给返回的临时值。但是,您可以重新获取任意一个指针的副本,该副本指向与其“原型”(它是其副本的变量)相同的位置,并且可以取消引用以获得真正的左值,C++可以在C++中使用,但在C中没有问题。这个问题被标记为C。这个问题是关于C的,它有不同的语法。
int x;
-x = 3;  /* lhs is not an lvalue */

const int cx = 3;
cx = 4;  /* lhs is not modifiable */
SomeType answer;
!answer = 42;
int a=2, b=22;
a>b?a:b=222;
#include <stdio.h>
main()
{
  int a=2, b=22;
  printf("answer: %d",a>b?a:b=222 );
}
a>b?a:b=222;
(a>b)?a:(b=222);