ot2sy39's note

twitter 140文字じゃ書けないときの外部エントリみたいな

awk:変数でフィールドアクセスする際のメモ

優先順位操作の()を付けないパターン

  1. 変数_に1を代入。

  2. 最初のprint。$_すなわち$1、つまり1を出力。そして$1をインクリメントし2に。変数_は1のまま。

  3. 2個目のprint。$1と$_、つまり$1を2回出力。$1は2になってるので、2 2と出力される。

フィールド参照演算子の後に()を付けるパターン

  1. 変数_に1を代入。

  2. 最初のprint。$_すなわち$1、つまり1を出力。そして変数_をインクリメントし2に。$1は1のまま。

  3. 2個目のprint。$1と$_、つまり$1と$2を出力。出力は1 3

フィールドが非数値の場合

  1. 変数iに1を代入。

  2. 最初のprint。$iすなわち$1を出力するのだが、$1にインクリメント演算子がついているため数字にキャストされてしまうようで、aではなく0になってしまう。$1は0をインクリメントした1に。iは1のまま。

  3. 2個目のprint。$1と$i、つまり$1と$1を出力。$1は1になっているので、出力は1 1

考察

$1="a"な状態で、print $1++が0を出力するのが、意外というか直感に反するというか。 ポストインクリメント演算子は評価したあとにインクリメントするのだから、 print $1++はaを出力し、その後$1=1になるなら分かるんだけど。 型キャストの方が先に行われてしまうのね。