“–>” 是什么运算符号
请看下面代码:
#include <stdio.h>
int main(void)
{
int x = 5;
while(x-->0){
printf("%d\n", x);
}
return 0;
}
然后编译,居然没有报错,运行结果是:
4
3
2
1
0
嗯?难道是新的c标准。再仔细看看,好吧,哈哈哈,其实是“–” 和 “>”,只是离得太近了看走眼了。
也就是, “–>”其实是自减符号“–”和大于符号“>”的结合,“while((x–)>0)”
那 **while(x–>0)**这么写有什么好坏呢?
明显缺点:
存在误解风险,因为输出的x值是从(x-1)到 0, 而不是从 x 到 0.
潜在应用:
或许可以用在遍历数组成员上,恰好可以处理每个成员。
#include <stdio.h>
int main(void)
{
char array[10];
for(size_t x=sizeof(array)/sizeof(array[0]); x-->0;){
// 处理每个成员
}
return 0;
}
现在有一个离奇的想法,假如自减两次可以吗?
while(x---->0){
printf("%d\n", x);
}
好吧,不可以,会报错
lvalue required as decrement operand
错误原因就是,自减操作需要一个左值,左值指的是指那些在内存中有持久地址的表达式,比如变量。
我猜测是,编译器禁止了两个值运算符号相连的行为,比如x-+, x*/等的。至于为啥如此,我也不知道了,或许是设计者当初是怕大家套娃使用引起未定义行为吧。对于编译器来说,未定义行为是危险的。