语法基石(二):运算符与表达式求值顺序

运算符这东西,说白了就是告诉计算机「你要怎么处理这些数据」。加减乘除、大小比较、逻辑判断——在 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 宏的优先级从高到低是这样的:

  1. 括号 () —— 最高优先级,想先算啥就括起来
  2. 乘方 ^
  3. 乘、除、取模 * / %
  4. 加、减 + -
  5. 比较运算符 > < >= <= == !=
  6. 逻辑与 &&
  7. 逻辑或 ||
  8. 赋值 = —— 最低优先级,最后执行

举个例子,你看这个表达式:

result = 5 + 3 * 2 ^ 3 > 20 && 10 % 3 == 1

按优先级一步步拆解:

  1. 先算乘方:2 ^ 3 → 8
  2. 再算乘除取模:3 * 8 → 24,10 % 3 → 1
  3. 然后加法:5 + 24 → 29
  4. 比较运算:29 > 20 → 1(真),1 == 1 → 1(真)
  5. 逻辑与:1 && 1 → 1(真)
  6. 最后赋值:result = 1
我建议:别死记硬背优先级表。写复杂表达式时,多用括号把意图说清楚。比如上面那个例子,写成 result = ((5 + (3 * (2 ^ 3))) > 20) && ((10 % 3) == 1),虽然啰嗦了点,但半年后你回来看代码,一眼就能看懂。

知识结构总览

下面这张图把本章的运算符体系串起来了,你可以把它当个速查地图用。

Code V 宏运算符体系 算术运算符 比较运算符 逻辑运算符 + - * / ^ % == != > < >= <= && || ! 优先级:括号 > 乘方 > 乘除取模 > 加减 > 比较 > 逻辑与 > 逻辑或 > 赋值 💡 我的建议:复杂表达式多用括号, 别依赖优先级记忆,代码可读性第一

避坑指南:我踩过的那些坑

  • 赋值与比较混淆:我曾经在 if 条件里写 if a = 5,结果程序永远走 true 分支。排查了半小时才发现少写了一个等号。
  • 浮点数比较陷阱:直接比较浮点数相等 a == 0.1 可能因为精度问题返回假。我一般用 abs(a - 0.1) < 1e-6 来替代。
  • 逻辑短路效应:&& 左边为假时,右边不会执行。如果你在右边写了赋值或函数调用,可能会出意外。我习惯把有副作用的操作单独写一行。
  • 取模运算的负数结果:在 Code V 宏里,-7 % 3 返回的是 -1,不是 2。做循环索引时要特别小心。
重要提醒:运算符优先级不是用来炫技的。我见过有人写一行 20 个运算符的表达式,自己都算不清结果。记住——代码是写给人看的,顺便给机器执行。可读性永远比「看起来很厉害」重要。