将逗号运算符与条件运算符一起使用

我正在学习C ++,在使用,and?:运算符时偶然发现以下行为条件运算符具有这样的语法E1 ? E2 : E3,其中E1,E2和E3是表达式[1],[2]。我从以下代码开始:

#include <iostream>

using namespace std;

int main(){
    int x = 20, y = 25;
    x > y ? cout << "x > y\n" , cout << "x is greater than y" : cout << "x !> y\n", cout << "x is not greater than y";
    return 0;
}

和输出:

x !> y
x is not greater than y

这是我所期待的结果。但是,当我将值更改为int x = 25, y = 20x大于y时,得到以下输出:

x > y
x is greater than y
x is not greater than y

但我期望:

x > y
x is greater than y

这样表达的最后部分E3被计算即使当表达式的结果E1true

但是,当我将E2和E3放在圆括号中时,对于两种情况,当x> y和x <y时,程序的输出都是预期的。根据[1],逗号,[1]表示,运算符为E1和E2,如中的E1, E2,它本身就是一个表达式。基于此,我不理解为什么?:即使表达式E1为真,也要为表达式E3都计算运算符的最后部分

我的问题是:

1)我是否正确使用条件运算符?:

2)发生此意外结果的机制是什么?

3)为什么使用括号可以解决问题(或至少符合我的期望)?

我正在使用:gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1〜16.04.11)

非常感谢你。

[1] https://en.cppreference.com/w/cpp/language/expressions

[2] https://en.cppreference.com/w/cpp/language/operator_other

道伊

为了简单起见,我们考虑一个更易于阅读的语句:

foo ? a(), b() : c(), d();

我们遇到的第一个运算符是条件运算符(第7.6.16节):

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression

第二个操作数可以是一个表达式,也可以a(), b()是一个复合表达式。但是,第三个操作数只能是一个赋值表达式(第7.6.19节):

assignment-expression:
    conditional-expression
    yield-expression
    throw-expression
    logical-or-expression assignment-operator initializer-clause
assignment-operator: one of
    =  *=  /=  %=   +=  -=  >>=  <<=  &=  ^=  |=
c(), d()

不是其中之一,而是逗号表达式(第7.6.20 / 1节):

expression:
    assignment-expression
    expression , assignment-expression

一对用逗号分隔的表达式从左到右求值;左边的表达式是一个废弃值表达式。与左表达式相关联的每个值计算和副作用在与右表达式相关联的每个值计算和副作用之前进行排序。[...]

因此,整个语句中最后一个逗号运算符左侧的所有内容都是一个舍弃值表达式,该表达式将在逗号运算符右侧之前进行计算(并丢弃其结果)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将boost :: shared_ptr与重载下标运算符([])的类一起使用

来自分类Dev

将集合运算符与python regex模块一起使用

来自分类Dev

MongoDB:将$ near运算符与$ maxDistance一起使用时,点不在间隔内

来自分类Dev

使用sequelize,如何将OR运算符与where条件一起使用?

来自分类Dev

PYMONGO-如何将查询$ in运算符与MongoID一起使用?

来自分类Dev

如何将std :: <list> :: reverse_iterator与运算符+一起使用?

来自分类Dev

在Scala中将“或”运算符与Int一起使用

来自分类Dev

将“ if let”与逻辑“或”运算符一起使用

来自分类Dev

将条件运算符与ng-class一起使用-AngularJS

来自分类Dev

使用$运算符将两个括号链接在一起

来自分类Dev

将OR运算符与2个具有相同值的占位符一起使用

来自分类Dev

将'mod'运算符与'or'一起使用时的强制性验证?

来自分类Dev

将mongo $ slice运算符与另一个运算符一起使用

来自分类Dev

将Like运算符与两个字段一起使用

来自分类Dev

逗号运算符

来自分类Dev

将$ cond与DBRef比较一起使用时,无效的运算符'$ ref'

来自分类Dev

MongoDB:将$ near运算符与$ maxDistance一起使用时,点不在间隔内

来自分类Dev

使用sequelize,如何将OR运算符与where条件一起使用?

来自分类Dev

一起使用AND / OR运算符

来自分类Dev

将Vector与类一起使用时没有运算符错误

来自分类Dev

Oracle SQL:将IN运算符与内联数组一起使用

来自分类Dev

将'mod'运算符与'or'一起使用时的强制性验证?

来自分类Dev

检测损坏的JPEG:将find -exec与||一起使用 逻辑运算符

来自分类Dev

为什么“ var”关键字不能与逗号运算符一起使用?

来自分类Dev

如何将 Nim 的 `of` 运算符与泛型一起使用?

来自分类Dev

将逻辑运算符与 excel 字符串一起使用

来自分类Dev

可与“+”运算符一起使用的通用类型

来自分类Dev

#define 与运算符一起使用

来自分类Dev

将 R `outer` 与 `%in%` 运算符一起使用

Related 相关文章

  1. 1

    将boost :: shared_ptr与重载下标运算符([])的类一起使用

  2. 2

    将集合运算符与python regex模块一起使用

  3. 3

    MongoDB:将$ near运算符与$ maxDistance一起使用时,点不在间隔内

  4. 4

    使用sequelize,如何将OR运算符与where条件一起使用?

  5. 5

    PYMONGO-如何将查询$ in运算符与MongoID一起使用?

  6. 6

    如何将std :: <list> :: reverse_iterator与运算符+一起使用?

  7. 7

    在Scala中将“或”运算符与Int一起使用

  8. 8

    将“ if let”与逻辑“或”运算符一起使用

  9. 9

    将条件运算符与ng-class一起使用-AngularJS

  10. 10

    使用$运算符将两个括号链接在一起

  11. 11

    将OR运算符与2个具有相同值的占位符一起使用

  12. 12

    将'mod'运算符与'or'一起使用时的强制性验证?

  13. 13

    将mongo $ slice运算符与另一个运算符一起使用

  14. 14

    将Like运算符与两个字段一起使用

  15. 15

    逗号运算符

  16. 16

    将$ cond与DBRef比较一起使用时,无效的运算符'$ ref'

  17. 17

    MongoDB:将$ near运算符与$ maxDistance一起使用时,点不在间隔内

  18. 18

    使用sequelize,如何将OR运算符与where条件一起使用?

  19. 19

    一起使用AND / OR运算符

  20. 20

    将Vector与类一起使用时没有运算符错误

  21. 21

    Oracle SQL:将IN运算符与内联数组一起使用

  22. 22

    将'mod'运算符与'or'一起使用时的强制性验证?

  23. 23

    检测损坏的JPEG:将find -exec与||一起使用 逻辑运算符

  24. 24

    为什么“ var”关键字不能与逗号运算符一起使用?

  25. 25

    如何将 Nim 的 `of` 运算符与泛型一起使用?

  26. 26

    将逻辑运算符与 excel 字符串一起使用

  27. 27

    可与“+”运算符一起使用的通用类型

  28. 28

    #define 与运算符一起使用

  29. 29

    将 R `outer` 与 `%in%` 运算符一起使用

热门标签

归档