语法基石(二):运算符与表达式求值顺序
运算符这东西,说白了就是告诉计算机「你要怎么处理这些数据」。加减乘除、大小比较、逻辑判断——在 Code V 宏里,它们都有自己的一套规矩。我刚开始写宏的时候,经常在运算符优先级上栽跟头,后来慢慢摸清了门道,今天就跟你聊聊这些。
算术运算符:最基础的数学工具
Code V 宏的算术运算符跟大多数语言差不多,但有几个细节你得留意。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | a = 5 + 3 |
8 |
- |
减法 | b = 10 - 4 |
6 |
* |
乘法 | c = 3 * 7 |
21 |
/ |
除法 | d = 15 / 4 |
3.75 |
^ |
乘方 | e = 2 ^ 3 |
8 |
% |
取模(余数) | f = 17 % 5 |
2 |
个人习惯:我写宏的时候,乘方运算用得特别多——尤其是计算光学系统的缩放比例时。比如你要把系统放大 2.5 倍,直接写
scale = 2.5 ^ 1 就完事了,比手动乘来乘去清爽得多。
这里有个坑:除法运算的结果是浮点数,哪怕两个整数相除。我记得有一次写循环,用 i / 2 判断奇偶,结果死活不对——因为 3 / 2 返回的是 1.5,不是 1。后来改成 i % 2 才搞定。
比较运算符:让程序学会判断
比较运算符返回的是逻辑值——真(1)或假(0)。这在条件判断和循环控制里是核心角色。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 5 |
1(真) |
!= |
不等于 | 5 != 3 |
1(真) |
> |
大于 | 7 > 4 |
1(真) |
< |
小于 | 3 < 8 |
1(真) |
>= |
大于等于 | 6 >= 6 |
1(真) |
<= |
小于等于 | 9 <= 5 |
0(假) |
我曾经踩过的坑:用
= 代替 == 做比较。在 Code V 宏里,= 是赋值,== 才是比较。写 if a = 5 不会报错,但会把 5 赋给 a,然后条件永远为真——这种 bug 最难找。
逻辑运算符:组合判断条件
实际项目中,很少只用单个条件做判断。比如「镜片厚度在范围内 并且 曲率半径合理」——这时候就需要逻辑运算符上场了。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
&& |
逻辑与(AND) | (3 > 2) && (5 < 10) |
1(真) |
|| |
逻辑或(OR) | (3 < 2) || (5 < 10) |
1(真) |
! |
逻辑非(NOT) | !(3 > 2) |
0(假) |
你想想看,如果不用逻辑运算符,你得写多少层嵌套的 if?我见过一个老兄写的代码,光判断条件就嵌套了 8 层,看得我头皮发麻。用 && 和 || 组合一下,一行就搞定。
实战案例:检查一个镜片是否在可加工范围内:
这样写,三个条件同时满足才执行后续操作,清晰又高效。
if (thickness > 1.0) && (thickness < 5.0) && (radius > 10.0)这样写,三个条件同时满足才执行后续操作,清晰又高效。
表达式求值顺序:别让优先级坑了你
运算符优先级,说白了就是「先算谁、后算谁」的规则。我见过太多新手(包括当年的我)在这个问题上翻车。
Code V 宏的优先级从高到低是这样的:
- 括号
()—— 最高优先级,想先算啥就括起来 - 乘方
^ - 乘、除、取模
*/% - 加、减
+- - 比较运算符
><>=<===!= - 逻辑与
&& - 逻辑或
|| - 赋值
=—— 最低优先级,最后执行
举个例子,你看这个表达式:
result = 5 + 3 * 2 ^ 3 > 20 && 10 % 3 == 1
按优先级一步步拆解:
- 先算乘方:
2 ^ 3→ 8 - 再算乘除取模:
3 * 8→ 24,10 % 3→ 1 - 然后加法:
5 + 24→ 29 - 比较运算:
29 > 20→ 1(真),1 == 1→ 1(真) - 逻辑与:
1 && 1→ 1(真) - 最后赋值:
result = 1
我建议:别死记硬背优先级表。写复杂表达式时,多用括号把意图说清楚。比如上面那个例子,写成
result = ((5 + (3 * (2 ^ 3))) > 20) && ((10 % 3) == 1),虽然啰嗦了点,但半年后你回来看代码,一眼就能看懂。
知识结构总览
下面这张图把本章的运算符体系串起来了,你可以把它当个速查地图用。
避坑指南:我踩过的那些坑
- 赋值与比较混淆:我曾经在
if条件里写if a = 5,结果程序永远走 true 分支。排查了半小时才发现少写了一个等号。 - 浮点数比较陷阱:直接比较浮点数相等
a == 0.1可能因为精度问题返回假。我一般用abs(a - 0.1) < 1e-6来替代。 - 逻辑短路效应:
&&左边为假时,右边不会执行。如果你在右边写了赋值或函数调用,可能会出意外。我习惯把有副作用的操作单独写一行。 - 取模运算的负数结果:在 Code V 宏里,
-7 % 3返回的是 -1,不是 2。做循环索引时要特别小心。
重要提醒:运算符优先级不是用来炫技的。我见过有人写一行 20 个运算符的表达式,自己都算不清结果。记住——代码是写给人看的,顺便给机器执行。可读性永远比「看起来很厉害」重要。