#include <stdio.h>
int main(){
float a[5];
float e;
int lo, hi, mi;
int i;
lo = 0; hi = 5;
printf("please input e:");
scanf("%f", &e);
printf("please input array:");
for(i = 0; i < 5; i++)
scanf("%f",&a[i]);
while(lo < hi){
mi = (lo + hi)>>1;
e < a[mi] ? hi = mi : lo = mi + 1; //这句报错;
}
printf("find the number: %f",a[--lo]);
}
错误信息:error: lvalue required as left operand of assignment,看字面意思是:赋值操作的左操作数必须使用左值。
于是我想应该就是条件表达式的优先级顺序导致的,于是就改为:
(e < a[mi]) ? (hi = mi) : (lo = mi +1);
程序完美运行,这也就提示我们要经常加括号啊。我查了下资料,条件运算符的优先级比赋值运算符的优先级高,所以通常条件运算符的用法如下:
x = y < 0 ? -y : y; //求一个数的绝对值;
附:
1、上面的例子的使用的编译器是codeblocks,报错。但是同样是不加括号,在c-free下是可以运行的,编译器之间还是有少许的区别的。
2、在线编译器有时候还真的挺好用,比如说像今天这种情况,可以测试程序的正确性啊。虽然缺点是速度慢点儿,还不能保存。
3、在线编译器:菜鸟教程在线编译器、ideone、dooccn,特别是dooccn,界面炫酷友好,操作还比较方便。