一元运算符只操作一个操作数,如++i、-x、!flag、*ptr、&a;i++虽后置但仍为一元;-号依上下文可作一元(取负)或二元(减法);二元运算符需左右两个操作数,如+、==、&&。

一元运算符就是只操作一个操作数的符号
比如 ++i、-x、!flag、*ptr、&a,它们都只作用于单个表达式。C++ 标准里明确把操作数个数作为分类依据,和“写在左边还是右边”无关——i++ 看似后置,但仍是**一元**,因为它只改变 i 自身的值,不涉及第二个操作数。
容易混淆的是 -:它既可作一元(取负)也可作二元(减法),编译器靠上下文判断:int a = -5; 中是 一元;int b = x - y; 中是 二元。
二元运算符必须有左右两个操作数
这是最常见的一类,包括 +、==、&&、、<code>= 等。关键识别点是:符号**两侧必须各有一个合法表达式**。比如 a + b 合法,++ + -- 不合法(无操作数支撑)。
a 是二元:左操作数是 <code>a,右操作数是2-
a = b = c是二元,但支持右结合:等价于a = (b = c),每个=仍只取两个操作数 - 重载时,二元运算符函数通常有两个参数(或一个隐式
this+ 一个显式参数)
三元运算符只有 ? : 这一个
C++ 中**仅此一个**三元运算符,语法固定为 condition ? expr1 : expr2。它不是三个独立符号的组合,而是一个整体语法单元:先求值 condition,再根据真假选择执行 expr1 或 expr2。
常见误判:
-
a && b || c看似“三个操作数”,实际是两个二元运算符的组合,按优先级和结合性分步计算 -
throw e、sizeof(int)、typeid(x)都不是三元,它们是关键字或运算符,但操作数个数不满足三元定义 - 不能重载
? :—— C++ 禁止重载三元运算符,这是硬性限制
区分时最容易忽略的其实是结合性和求值顺序
比如 a = b = c 是二元,但它是右结合;a + b + c 是左结合。这些不影响“元数”判定,却直接影响执行逻辑。更隐蔽的是 ? : 的短路求值:只有 condition 为真时才求值 expr1,为假时只求 expr2 —— 这种行为在自定义类型重载二元运算符时无法完全模拟。
真正要警惕的,是把操作符重载写成“看起来像三元”的形式,比如 a[x][y]:它本质是两次二元 [] 调用(a[x] 返回对象,再对结果调用 [y]),不是三元。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











