我有从C书复制的以下功能,我无法弄清楚为什么如果条件抛出错误。
if (k>0)
为什么
div > div:nth-child(2) {
background: red;
}
给'='左操作数必须是l值
答案 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
未初始化。