第5.8节:awk自增自减运算
1 第5.8节:awk自增自减运算
自增和自减运算符可使变量的值增加或减少 1。赋值运算符也能实现相同操作,所以自增运算符并未为 awk 语言增添新功能;不过,它们是极为常见操作的便捷缩写形式。
用于加 1 的运算符写作 ++
。它可在获取变量值之前或之后对变量进行自增。要对变量 v
进行前置自增,写作 ++v
。这会把 v
的值加 1 —— 这个新值同时也是该表达式的值。(赋值表达式 v += 1
与之完全等价 。)把 ++
写在变量之后,则表示后置自增。这同样会使变量值自增;区别在于,自增表达式本身的值是变量的旧值。因此,若 foo
的值为 4,表达式 foo++
的值为 4,但会把 foo
的值改为 5 。换句话说,该运算符返回变量的旧值,但会产生使变量自增的副作用。
后置自增 foo++
几乎等同于编写 (foo += 1) - 1
。但二者并非完全等价,因为 awk 中的所有数字都是浮点数 —— 在浮点运算里,foo + 1 - 1
不一定等于 foo
。不过,只要处理的是相当小的数字(小于 (10^{12}) ),差异就微乎其微。
字段和数组元素的自增方式与变量类似。(若想同时进行字段引用和变量自增,可使用 $(i++)
。由于字段引用运算符 $
的优先级,括号是必需的 。)
自减运算符 --
的工作方式与 ++
类似,只是它做的是减 1 操作而非加 1 。和 ++
一样,它可在左值(lvalue )之前使用实现前置自减,或在左值之后使用实现后置自减。以下是自增和自减表达式的总结:
++lvalue
:将lvalue
自增,返回新值作为表达式的值。lvalue++
:将lvalue
自增,返回lvalue
的旧值作为表达式的值。--lvalue
:将lvalue
自减,返回新值作为表达式的值。(此表达式类似++lvalue
,但不是加,而是减 。)lvalue--
:将lvalue
自减,返回lvalue
的旧值作为表达式的值。(此表达式类似lvalue++
,但不是加,而是减 。)
1.1 运算符求值顺序
如果你不清楚所写的表达式是否会存在歧义时,最好别那样写,使用更简单更易读的方式来书写,哪怕这样会看起来很low。
像下面这样的代码会发生什么情况呢?
b = 6
print b += b++
或者更奇怪的情况:
b = 6
b += ++b + b++
print b
换句话说,后缀运算符(b++
)规定的各种副作用何时生效?副作用的生效时机是由具体实现定义的。也就是说,取决于所用 awk 的具体版本。第一个示例的结果可能是 12 或 13 ,第二个示例的结果可能是 22 或 23 。
简而言之,这类写法不建议使用,而且绝对无法保证可移植性。你应在自己的程序中避免此类写法。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.