C++ primer中4.33练习逗号运算符的理解

今天在做primer的练习,发现一个问题,书上4.33练习的题目如下:

说明下面这个表达式的意义:

<pre name="code" class="cpp">someValue?++x,++y:--x,--y;

 

在CLion下编辑实验如下:

/**
 * test 4.33
 * 逗号运算符的效果
 */
#include <iostream>

using namespace std;
int main()
{
    int x = 10;
    int y = 20;
    //part 1
    bool someValue = true;
    someValue?++x,++y:--x,--y;
    cout << x << " " << y << " " << someValue << endl;
    //part 2
    someValue = false; x = 10;y = 20;
    someValue?++x,++y:--x,--y;
    cout << x << " " << y << " " << someValue << endl;
    return 0;
}

最后的运行结果如下:

11 20 1
9 19 0

所以,意味着,someValue为true时,并不是简单的运行了++x,++y,那究竟是如何运算的呢?

回过头看编译器,其实clion已经有了提示:


这里因为someValue的值是确定的,所以clion提示warning,并且以灰色来标注肯定不会运行的部分,与此对应,someValue为false时:


可以看到无论someValue的值怎么变,--y是肯定运算的,查阅书籍后,原因如下:

逗号运算符的优先级是最低的,主要作用是将几个算式并列并返回最右边的算式的结果,在刚才的表达式中,在编译器的眼中,真实的运算顺序为

(someValue?++x,++y:--x),--y;
故,--y被认为是一个独立的表达式,要改变这一情况,在表达式附近加上括号区分即可。

有关逗号运算符的更多信息与实验,可以看这篇博客:

http://www.cnblogs.com/hnrainll/archive/2011/08/03/2126660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值