输出流中的运算符优先级C++
C++ operator precedence in output stream
int a = 1, b = 2;
int c = a*b + b==0; // c = 0
cout << a*b + b==0; // outputs 4
c
的计算结果为 0
,因为*
运算符的运算符优先级高于==
+
运算符,因此c
的计算结果实质上是(a*b+b)==0
为假。
为什么在 cout
语句中放置相同的表达式会输出 4?
因为这些运算符的优先级是operator*
> operator+
> operator<<
> operator==
.那么cout << a*b + b==0;
等同于(cout << ((a*b) + b)) == 0;
.
那么((a*b) + b))
的结果,即 4
将被打印出来,则返回值 (cout << ((a*b) + b))
,即 cout
与0
进行比较。在 C++11 之前,cout
可以通过运算符 void* 隐式转换为 void*
,当 steram 有任何错误时,它会返回一个空指针。因此,这里将其与0
(即空指针)进行比较,并且对结果没有进一步的作用。
answr by @songyuanyao 已经解释了代码的行为。
我想回应 OP 说,编写易于遵循的代码会好得多。
如果您看不清表达式的逻辑,请简化它。使用括号使其更易于理解。除非你正在为混淆代码竞赛编写代码,否则没有理由编写这样的代码。
转换这些线
int c = a*b + b==0; // c = 0
自
int c = (a*b) + (b==0);
或到
int c = ((a*b + b) == 0);
取决于您的意图。
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- C++ 带有函数指针的运算符优先级
- 将更高的优先级设置为 boost::asio 线程处理进程
- 在C++中打印对的优先级队列的所有值时出现问题
- <<运算符优先级与字符串比较
- SFINAE 模板专用化优先级
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?