C三元表达式语句不起作用

时间:2016-01-30 12:14:29

标签: c conditional

#include <stdio.h>
int main()
{
  int a=3,b=4,g;
  a > b ? g = a : g = b ;
  printf("%d",g);
  return 0;
}

为什么不会打印g的值?编译器说lvalue是必需的。这是什么意思?

2 个答案:

答案 0 :(得分:15)

由于运算符?:优先于=,表达式

a > b ? g = a : g = b;   

将被解析为

(a > b ? g = a : g) = b;  

表达式(a > b ? g = a : g)将给出一个右值。赋值(=)运算符的左操作数必须是左值 1 (可修改 2 ) 。

更改

a > b ? g = a : g = b ;  

a > b ? (g = a) : (g = b);    

g = a > b ? a : b;

<子> <强> 1 即可。 C11-§6.5.16/ 2:赋值运算符的左操作数应具有可修改的左值。
2 即可。 §6.3.2.1/ 1: 左值是一个表达式 (对象类型不是void)可能指定一个对象 ; 64)如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定。 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归) ,所有包含聚合或联合的任何成员或元素具有常量类型

答案 1 :(得分:0)

  • 只需替换你的:

    a > b ? g = a : g = b ;
    

    a > b ? (g = a) : (g = b) ;
    
  • 因为括号的先验更高。因此,如果条件a > b变为真,则a的值被分配给g,如果失败,则将b的值分配给g。

    < / LI>