C语言三目运算符报错‘lvalue required as left operand of assignment’求解
解决三目运算符赋值错误并实现正确的时间差计算
首先来说你遇到的「lvalue required as left operand of assignment」错误——这是因为你搞反了三目运算符和赋值的顺序!
三目运算符condition ? expr1 : expr2的返回值是一个右值(比如gap/100是计算出来的具体数值,它不能被赋值),而赋值操作x = y要求左边必须是左值(也就是可以被赋值的变量,比如hour)。你写的gap > 0 ? gap/100 = hour : ...相当于给一个数值赋值,这在C里是不允许的,就像你不能写5 = hour一样。
正确的写法应该是把变量放在赋值的左边,用三目运算符的结果给它赋值,也就是你最开始写的那种形式:
hour = gap > 0 ? gap/100 : (2400 - gap)/100;
另外,你的代码还有几个小问题需要修正,同时我们可以优化时间计算的逻辑,让代码更简洁:
修正并优化后的完整代码
#include <stdio.h> int main() { int time1, time2, gap; int hour, minute; // 关闭输出缓冲,确保提示信息即时显示 setvbuf(stdout, NULL, _IONBF, 0); printf("Enter first time: \n"); scanf("%d", &time1); printf("Enter second time: \n"); scanf("%d", &time2); gap = time2 - time1; // 统一处理跨天的情况,把gap转为正的有效差值 gap = gap > 0 ? gap : 2400 + gap; hour = gap / 100; minute = gap % 100; printf("The gap of these times: %d hours, %d minutes\n", hour, minute); return 0; }
优化说明
- 统一差值处理:先把
gap转换为正的有效时间差(如果gap为负,说明时间跨天,直接加上2400即可),这样后面计算小时和分钟时不用重复判断,代码更清晰。 - 修正拼写错误:把最后一行的
print改为标准的printf,同时添加换行符让输出格式更规范。 - 冗余代码清理:去掉了重复调用的
setvbuf,只保留一次即可。 - 符合C标准:添加了
return 0;,让main函数的写法更规范。
测试你的示例场景
- 输入
1925和2358:gap=433,计算得4小时33分钟,符合预期。 - 输入
1540和1630:gap=90,计算得0小时50分钟,符合预期。 - 输入
0730和0720:gap=-10,转换为2390,计算得23小时50分钟,符合预期。
内容的提问来源于stack exchange,提问作者roku
相关产品推荐
相关产品推荐

