繁体   English   中英

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

[英]Why is my conditional operator giving me an error?

int a=2, b=22;
a>b?a:b=222;

这段代码给了我一个错误。 我认为这是因为条件运算符根据条件返回ab的值,因此该值不能用作Lvalue 就我而言,22 = 222,所以这是一个错误。

int *i, *j, a=2,b=222;
i = &a;
j = &b;
a>b?i:j=&a;

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

此时,我进行了搜索 我试过0x123 = &a; ,但编译器仍然会抛出错误。 我想编译器不允许我出于安全原因修改内存位置。

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

编辑错误是error: lvalue required as left operand of assignment

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

#include <stdio.h>
int main() {
  int a=2,b=4;
  *(b>2 ? &a : &b) = 7;
  printf("a = %d; b = %d\n", a, b);
  return 0;
}

C语法不允许在赋值运算符的左侧使用?:表达式。 上面的版本在语法上是正确的,因为赋值左侧的表达式是带有括号参数的解除引用表达式。

通过指针分配的唯一方法是使用*ptr = val; 指针的计算方式无关紧要,只要它是指向右侧类型的有效指针即可。 它甚至可以是常量 - 但是转换为指针 - 如果你有某种方式知道常量是有效地址: *(int*)(0x124) = 42; 但是你总是需要dereference运算符来指示你通过指针进行分配。


详细的语法解释:

有两个相关的语法产品,它们证明了C和C ++之间在原始表达方面的区别('a> b?a:b = 222`)

在C中,我们有(§§6.5.15-16):(强调添加)

在C ++中,等效产品(§§5.16-17):(强调添加)

请注意,在C中,赋值运算符之前唯一可以出现的是一元表达式 ,因此像条件表达式这样复杂的东西需要在括号中。 此外, 条件表达式的右侧操作数必须是条件表达式,这意味着赋值表达式无效。

相比之下,在C ++中, 赋值表达式中赋值的操作数可以是逻辑或表达式 ,这仍然意味着条件表达式无效,但允许其他可能性(其中许多可能仅在运算符重载时有用) )。 但是C ++ 条件表达式 可以赋值表达式作为其最右边的操作数。

所以在C中, a>b?a:b=222是语法错误。 它不能由任何expression 但是在C ++中,相同的表达式是合法的,条件运算符的最右边的操作数是b=222 ; 换句话说,它与a>b?a:(b=222)

需要注意的是,仅仅因为表达式符合语言的语法并不意味着表达式是合法的。 赋值运算符的左侧必须是“可修改的左值”。 因此,以下语法正确的表达式都不合法:

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

const int cx = 3;
cx = 4;  /* lhs is not modifiable */

在C ++中,如果SomeType::operator!(int)返回引用,那么这个可能是合法的:

SomeType answer;
!answer = 42;
int a=2, b=22;
a>b?a:b=222;

我已经在GCC版本4.8.1中运行了上面的代码,它工作正常。 然后我将其更改为以下将清除您的视图。

#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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM