细到极致的操作符(3)

好了承接上文,如果第一篇对你来说太过深奥,又或者你是从第二篇开始看我的博客的,都要感谢你们的阅读。第一篇的博客看不懂没关系,你只要知道有这个东西,而且是为什么这样用就可以了。下篇文章将是这个系列的最重要的知识点。因为我会讲关于操作符属性和隐性类型转换这种你所见的很少的东西。

9.条件操作符

exp1 ? exp2 : exp3

那么这个操作符怎么用呢? 这个表达式可以写成这样

条件:表达式1:表达式2

也就是说,如果条件为真,那就是结果表达式1,假就是表达式2。

放两道题就很简单容易上手了

1.
if (a > 5)
        b = 3;
else
        b = -3;
转换成条件表达式,是什么样?
2.使用条件表达式实现找两个数中较大值。


int main() {
    int a = 5;
    int b = 3;
    int max = (a > b)? a : b;
    return 0;
}
 

好吧这两个题其实是同一道题,马上就能得解。我们再看下一个。

10.逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最 后一个表达式的结果。

老规矩,上代码!

//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?
//代码2
if (a =b + 1, c=a / 2, d > 0)
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
         //业务处理
        a = get_val();
        count_val(a);
}
如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
         //业务处理
}

代码一首先定义了`int a = 1`,`int b = 2`。
然后看逗号表达式`(a>b, a=b+10, a, b=a+1)`。在逗号表达式中,会从左到右依次计算每个表达式。
先计算`a>b`,此时`a = 1`,`b = 2`,`a>b`为假(值为0),但这个结果在逗号表达式中会被丢弃。
接着计算`a=b+10`,即`a = 2 + 10 = 12`。
再计算`a`,这一步只是计算但没有改变值,此时`a`依然是12。
最后计算`b=a+1`,即`b = 12 + 1 = 13` 。整个逗号表达式的值是最后一个表达式的值,所以整个逗号表达式的值是`b=a+1`执行完后`b`的值13,将其赋值给`c`。

代码二此处if (a =b + 1, c=a / 2, d > 0)代码是错误的,代码中`d`未定义,不过仅从已有正确部分看,先执行`a =b + 1`(此时`a`被赋值为`2 + 1 = 3`),然后执行c=a / 2(`c`被赋值为`3 / 2 = 1`,因为是整型除法),但由于`d`未定义所以是无法判断整体`if`条件是否成立的。

代码三的话就是一个逻辑改写嘛,由于`get_val()`和`count_val()`不知道具体逻辑,但整体是当`a > 0`时不断执行`a = get_val()`和`count_val(a)`再进行业务处理。所以逗号表达式也通常用于for循环等显性循环。

又写到1200字左右了,我希望我带来的是深度思考的,好了我们下篇文章见,下篇文章我们将讲到下标引用、函数调用和结构成员。可能会有点难。感谢观看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值