编程这行当,入门的时候有一道绕不过去的坎,就是运算符。很多人学了两三个月,写代码能跑,但一问"单目、双目、三目运算符到底怎么分",就开始含糊了。更常见的情况是:看到一长串表达式,比如a ? b : c或者*p++,根本不知道编译器是从哪头开始读的。其实这个知识点一点都不难,关键在于你把"操作数"和"运算符"的关系理顺。这篇就把这个基础但极其重要的概念掰开揉碎讲清楚,看完你不仅能分清什么是单目、双目、三目,还能彻底搞懂为什么有些运算符长得像、用法却天差地别。
先说个扎心的现象:很多教程讲运算符,上来就铺一张大表,什么算术、关系、逻辑、位、赋值、条件,几十个符号排得密密麻麻。读者看完就一个感觉——背不下来。我当年学C语言也是这样,死记硬背了两个月,一到实际写代码,++和--放前面还是放后面,照样得翻书。后来有个老工程师点了我一句:你不要按符号去记,要按"它需要几个操作数"去记。这一下就通了。
为什么这么说?因为运算符的"目数"直接决定了表达式的结构、运算顺序、以及编译器怎么解析这段代码。你把"几目"搞明白了,比背一百遍运算符优先级表都管用。这篇文章我就按这条线来讲,先讲清楚操作数与运算符到底是怎么配合的,再分别拆解单目、双目、三目运算符的代表成员和坑点,最后给你一套能直接用在实际开发里的判断方法。
1. 操作数和运算符的本质关系:一个动作配几个"演员"
我们写代码,本质上就是在让计算机执行一系列动作,比如"把两个数加起来"、"判断一个值是不是真"、"把一个变量赋给另一个变量"。这些动作里,扮演"动作"角色的就是运算符,而被这个动作施加的那些数据,就是操作数。
1.1 一个简单的例子帮你建立直觉
看这句代码:
javascript复制let result = a + b;
这里发生了两个动作:
+这个动作,它需要两个"演员"来配合,左边一个a,右边一个b,它才能完成加法。所以+是双目运算符(也叫二元运算符)。=这个赋值动作,它也需要两个"演员",右边是a + b这个整体,左边是result这个变量。所以=也是双目运算符。
在这个表达式里,a、b、result都是操作数。你发现没有,一个完整的表达式,其实就是运算符和操作数按一定规则拼起来的组合体。你只要数一数"这个动作需要几个演员",就能立刻判断它是几目。
这样说可能还不够直观,我打个比方。你想象一个食堂打菜的窗口:
- 单目运算符就像"打菜"这个动作,只需要一个盘子(一个操作数)就能完成。
- 双目运算符就像"把两个菜拼在一起",需要两个盘子(两个操作数)。
- 三目运算符就像"选套餐",需要你先回答一个问题,再根据答案从两个套餐里选一个(一个判断条件加两个备选结果,总共三个操作数)。
一个运算符需要几个"盘子"来接数据,它就是几目。这就是操作数与运算符之间最朴素的关系。
1.2 为什么"目数"这个分类这么重要
很多初学者会问:我管它几目干嘛?我把每个运算符的用法记住不就行了?
问题恰恰在于,运算符实在太多了,而且很多长得像但用法完全不同。比如-可以是减法(双目),也可以是取负(单目);*可以是乘法(双目),也可以是解引用(单目);&可以是按位与(双目),也可以是取地址(单目)。如果你记的是"-就是减号",那遇到-a这样的代码你一定会懵:这减号减谁呢?
反过来,如果你脑子里先有"目数"这个维度,你看到-a,第一反应是"这里-只有一个操作数a,所以它是单目运算符,作用是取负"。思路一下就清晰了。
所以我说,"目数"是所有运算符的"身份证"。按这个维度去梳理,你就能把几十个运算符重新归类成三大阵营,每个阵营的运算特点、书写规则、优先级规律都有章可循。这比逐个记忆要高效得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单目运算符:一个操作数撑起一台戏
单目运算符,也叫一元运算符,是你写代码时最常用的"小动作"。它只需要一个操作数就能完成运算。别小看它,虽然结构简单,但它藏着不少面试最爱考的细节。
2.1 单目运算符的典型代表
不同语言里单目运算符略有差异,但有几个是几乎所有语言通用的:
| 运算符 | 含义 | 示例 | 说明 |
|---|---|---|---|
+ |
正号 | +a |
一般没啥用,但能显式声明正数 |
- |
取负 | -a |
把数值变成相反数 |
++ |
自增 | a++ 或 ++a |
变量自身加1 |
-- |
自减 | a-- 或 --a |
变量自身减1 |
! |
逻辑非 | !flag |
取反布尔值,true变false |
~ |
按位取反 |
