得到错误"左值作为赋值的左操作数"

时间:2016-06-29 13:47:44

标签: c compiler-errors ternary-operator conditional-operator

我是C的新手,编译简单代码时遇到以下问题:

#include <stdio.h>

int main()
{
    int i, a, b;
    i = 3;
    a = b = 0;

    printf("Before: ");
    printf("%d %d\n", a, b);
    i == 3 ? a = 4 : a = 10; /* Line 9 */

    printf("After: ");
    printf("%d %d\n", a, b);
    return 0;
}

给我错误:

#gcc some.c
In function ‘main’:
some.c:9: error: lvalue required as left operand of assignment

我无法理解。我做错了什么?

6 个答案:

答案 0 :(得分:7)

此运算符

i==3 ? a=4 : a = 10;

相当于

( i==3 ? a=4 : a ) = 10;

改为使用

i==3 ? a=4 : ( a = 10 );

答案 1 :(得分:2)

a = (i == 3 ? 4 : 10);

试试这个! : - )

答案 2 :(得分:2)

您需要在三元运算符外部进行分配,而不是在其内部,因为三元运算符比赋值更紧密。所以你应该写

(i == 3 ? a = 4 : a ) = 10;

你写的内容等于

myfunc() = 16;

在此代码中,正在分配rvalue。这与写

的错误相同
if (i == 3)
    a = 4;
else
    a = 10;

化妆品注意:在这种情况下,最好使用if else语句而不是条件运算符,因为这里更清楚。

import io, sys
import pyparsing as pp

def diag(msg, t):
    print("%s: %s" % (msg , str(t)) )


def pa_logic_oper(t):   diag('logic_oper', t)
def pa_operand(t):      diag('operand', t)
def pa_ident(t):        diag('ident', t)
def pa_logic_cmd(t):    diag('>>>>>> logic_cmd', t)
def pa_cmd_line(t):     diag('cmd_line', t)

def make_grammar():

    semi = pp.Literal(';')
    ident = pp.Word(pp.alphas, pp.alphanums).setParseAction(pa_ident)
    operand = (ident).setParseAction(pa_operand)

    op_and     = pp.Keyword('A')
    op_or      = pp.Keyword('O')

    logic_oper = (( op_and | op_or) + pp.Optional(operand))
    logic_oper.setParseAction(pa_logic_oper)

    logic_cmd = logic_oper + pp.Suppress(semi)
    logic_cmd.setParseAction(pa_logic_cmd)

    cmd_line = (logic_cmd)
    cmd_line.setParseAction(pa_cmd_line)

    grammar = pp.OneOrMore(cmd_line) + pp.StringEnd()

    return grammar

if __name__ == "__main__":
    inp_str = '''
      A param1;
      O param2;
      A ;
      '''
    grammar = make_grammar() 
    print( "pp-version:" + pp.__version__)

    parse_res = grammar.parseString( inp_str )

'''USAGE/Output: python test_4.py
pp-version:2.0.3
operand: ['param1']
logic_oper: ['A', 'param1']
cmd_line: ['A', 'param1']
operand: ['param2']
logic_oper: ['O', 'param2']
cmd_line: ['O', 'param2']
logic_oper: ['A']
cmd_line: ['A']
'''

答案 3 :(得分:2)

?:是三元运营商 三元运算符的优先级高于&#39; =&#39;运营商。
所以代码的第9行就像这样工作..

    (i == 3 ? a = 4 : a) = 10;

你必须使用括号或修改你的句子 你可以用以下任一行替换你的第9行..

    i == 3 ? a = 4 : (a = 10);

    a = i == 3 ? 4 : 10;

答案 4 :(得分:1)

试试这个

if (i==3) a = 4; else a = 10;

答案 5 :(得分:0)

三元运算符不能像这样工作。您应该使用括号来为相等运算符赋予更高的优先级。检查优先级优先级。默认情况下,相等运算符的优先级最低。