首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 運算子優先級陷阱:逗號運算子與輸出流運算子的優先級差異

     編輯:程式設計綜合問答

代碼

#include <iostream>
using namespace std;

void main() {
    int a = 15, b = 26;
    cout << (a, b) << endl;  // 輸出 26
    cout << a, b;            // 輸出 15
}

輸出結果

26
15

深度解析

第一句:cout << (a, b)

  • 括號內 (a, b) 是逗號運算式:先求值 a(丟棄),再求值 b,**整個運算式的值是 b (26)**。
  • 然後執行 cout << 26,輸出 26。

第二句:cout << a, b

  • C++ 運算子優先級:**<< (左移/流插入) > , (逗號)**。
  • 因此等價於 (cout << a), b:
  • 先執行 cout << a → 輸出 15,返回 cout 引用;
  • 再執行逗號運算式的右側 b(值 26,但被丟棄,無副作用)。

運算子優先級表(節選)

優先級運算子結合性
高<< (流插入)左→右
低, (逗號)左→右

避坑指南

  • **永遠用括號明確分組**,不要依賴記憶中的優先級。
  • 逗號運算式極易誤讀,**盡量避免在複雜運算式中使用**;若需序列求值,改用分號分隔語句或 { expr1; expr2; } 塊。
  • 流運算子 << 是重載函式,**重載不改變優先級與結合性**——這是 C++ 標準保證的。

總結

cout << a, b 之所以只輸出 a,是因為 << 優先級高於逗號,導致逗號右側的 b 成為獨立運算式被忽略。加上括號 cout << (a, b) 則先執行逗號運算式取得 b 再輸出。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved