在C语言中,三目运算符(? :)是什么概念?

4
在使用GCC编译器编译给定程序时:
int main()  
{  
      int a=2,b=3;  
      (a>1)?b=10:b=50;  
      printf("%d",b);  
      return 0;     
}


出现错误提示:"lvalue required as left operand"
但如果我将第四行写成

(a>1)?b=10:(b=50);

那么就不会出现编译错误。有人能解释一下为什么吗?还有,它与if...else...有何不同?


5
这句话的意思是:将其解析为:((a>1)?b=10:b) = 50; - Mysticial
3个回答

5

正如评论中提到的,您遇到了操作符优先级问题。您的代码被解释为:

((a > 1) ? b = 10 : b) = 50;

由于写成 (b = 10) = 50 是无效的,因此上述代码也是无效的。

可以更清晰地写出这段代码:

b = a > 1 ? 10 : 50;

还有,它与 if...else... 有什么区别呢?

条件运算符只能处理表达式作为操作数。而 if 语句可以包含语句在其内部。

条件运算符总是可以被等价的 if 语句替换。但反过来却不一定成立 - 有些 if 语句无法被等价的条件运算符表达式替换。


2
你遇到的问题是运算符优先级。 = 运算符的优先级低于 ?: 运算符。

你是指“=运算符比?:的优先级低”吗?因为首先执行?:,然后才是赋值。 - poitroae

2
我认为你的代码应该是这样的:
int main()  
{  
      int a=2,b=3; 

      b=(a>1)?10:50; 

      printf("%d",b);  
      return 0;     
}

欢呼。

b 看起来像是一个二阶指针。 - huseyin tugrul buyukisik
很抱歉我没有注意到其他错误。 实际上它现在应该是这样的,对于 ** 我感到抱歉,我以为它们会使内部字符加粗。 - Azurlake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接