gpt4 book ai didi

C错误:lvalue required as left operand of assignment

转载 作者:行者123 更新时间:2023-11-30 19:59:44 27 4
gpt4 key购买 nike

#include<stdio.h>
int hailstone(int n){
int length=1;
while(1<n){(n%2)?n=3*n+1:n/=2;length++;}//error
//while(1<n){(n%2)?n=3*n+1:(n/=2);length++;} right
return length;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",hailstone(n));
}

第四行有错误,gcc编译器说需要左值作为赋值的左操作数,但是如果我添加括号它将是正确的。就像第五行一样,我不知道为什么.

最佳答案

尽管将所有逻辑都塞进一行,但问题实际上出在一个表达式中(请原谅我添加空格):

(n%2) ? n=3*n+1 : n/=2

precedence rules for C expressions都是这样的。赋值(包括复合赋值)的绑定(bind)不如 ?: 紧密。因此编译器必须将您编写的内容解释为:

((n%2) ? n=3*n+1 : n) /=2

由于 ?: 不会生成左值(可以出现在赋值左侧的值),因此您会收到错误。您使用括号会强制优先级与您想要的相匹配。

但是更好的编写方法是不要“聪明”,并认为在单个表达式中使用尽可能多的标记有一定的“优雅”。这是另一个版本,它更具可读性,并且更容易验证其正确性:

if (n%2) {
n = 3*n+1;
} else {
n /= 2;
}

而且它的效率并不比使用条件表达式低。

关于C错误:lvalue required as left operand of assignment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55020533/

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