C语言有趣小例子(一):“-->”是什么运算符?

“–>” 是什么运算符号

请看下面代码:

#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*/等的。至于为啥如此,我也不知道了,或许是设计者当初是怕大家套娃使用引起未定义行为吧。对于编译器来说,未定义行为是危险的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值