【问题标题】:C ternary expression-statement not working [duplicate]C三元表达式语句不起作用[重复]
【发布时间】:2016-05-08 04:47:23
【问题描述】:
#include <stdio.h>
int main()
{
  int a=3,b=4,g;
  a > b ? g = a : g = b ;
  printf("%d",g);
  return 0;
}

为什么g 的值没有被打印出来?编译器说lvalue 是必需的。什么意思?

【问题讨论】:

  • 您必须将 a &gt; b ? g = a : g = b ; 更改为 g = a &gt; b ? a : b;a &gt; b ? g =a : (g = b);

标签: c conditional


【解决方案1】:

由于运算符?: 的优先级高于=,因此表达式

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

将被解析为

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

表达式(a &gt; 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 限定类型,并且如果它是结构体或联合体,则没有任何成员(包括递归,所有包含的聚合或联合的任何成员或元素)具有 const 限定类型

【讨论】:

  • 请您解释一下您的行:-“= 运算符的左操作数必须是左值(可修改)。”
  • @sam;添加了一些关于“左值”和“可修改左值”的细节。
【解决方案2】:
  • 只需替换您的:

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

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

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 2016-12-18
    • 2017-02-15
    • 2019-12-09
    • 2019-09-28
    • 1970-01-01
    • 2011-01-11
    • 2022-12-17
    相关资源
    最近更新 更多