gpt4 book ai didi

c - C 中左操作数必须是左值

转载 作者:行者123 更新时间:2023-11-30 18:29:04 27 4
gpt4 key购买 nike

我有以下从 C 书复制的函数,我不明白为什么 if 条件抛出错误。

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;

}
}

为什么

if (k>0) 

给“=”左操作数必须是左值

最佳答案

你的编译器显然解析了表达式

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

这使得不可能将 && 偷运到赋值的左侧,除非您明确地将左侧包含在 () 中。

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

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

关于c - C 中左操作数必须是左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645264/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com