左操作数必须是C中的l值

时间:2017-01-14 00:00:53

标签: c lvalue

我有从C书复制的以下功能,我无法弄清楚为什么如果条件抛出错误。

if (k>0) 

为什么

    div > div:nth-child(2) {
        background: red;
    }

给'='左操作数必须是l值

2 个答案:

答案 0 :(得分:3)

您的编译器显然会解析表达式

k > 0 && t[k] = '\0'

作为

(k > 0 && t[k]) = '\0'

即。它认为您正在尝试将'\0'分配给k > 0 && t[k]的结果。后者不是左值。你无法为它指定任何东西。

显然你的代码没有被复制"正如你似乎声称的那样,从一本书中。我强烈怀疑这本书使用==运算符,您使用的是=

要迂腐,在这种情况下,您正在处理GNU编译器(以及其他一些C编译器)的一个众所周知且相当奇怪的行为。 官方 C语法以非常特殊的方式编写,可以防止像

这样的表达式
k > 0 && t[k] = '\0'

完全被解析。赋值表达式的C语法是

assignment-expression:
  conditional-expression
  unary-expression assignment-operator assignment-expression

这使得无法将&&走私到作业的左侧,除非您明确将左侧括在()中。

换句话说,"左操作数必须是l值"是一个误导性的错误消息。对这种情况的正确解释是,在C语言中,这个表达式在语法上是不正确的。它只是根本无法解析。从形式语言的角度来看,这种表达纯粹是毫无意义的mumbo-jumbo。

通过发布虚假"左操作数必须是l值"诊断编译器正式满足标准的要求(它必须发出一些诊断,无论它说什么),但是,原始代码中的正式问题与任何&&无关#34;左值"

答案 1 :(得分:1)

在功能

int strindex(char s[], char t[]) {
int index,k;

for (int i = 0; s[i] != '\n'; i++) {
    for (int j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
        continue;
    if (k > 0 && t[k] = '\0')
        return i;

    }
}

声明了两个变量k。第一行在此行中声明

int index,k;
^^^      ^^^

,第二行在此行中声明

for (int j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
     ^^^       ^^^ 

在本声明中

if (k > 0 && t[k] = '\0')

使用了第一个未初始化的变量k。而且似乎是由于错字

if (k > 0 && t[k] = '\0')
                 ^^^^

即使用赋值运算符而不是比较运算符,if语句中的条件看起来像

if ( ( k > 0 && t[k] ) = '\0')

因此无效。

我认为你的意思是

if (k > 0 && t[k] == '\0')
                  ^^^

尽管在任何情况下此语句都无效,因为变量k未初始化。