`!a[$0]++` の awk 演算子優先順位

`!a[$0]++` の awk 演算子優先順位

awk表現がありますが、!a[$0]++正確な評価順序を知りたいです。 awkの文書によると、++の優先順位はより高いです!。しかし、この例では、++サフィックス形式はyes(!++a[$0]私が理解したところではない)は基本的にawkに「他の部分を最初に評価してから私を評価する」と指示します。この場合、評価順序はどうなりますか?

ベストアンサー1

ここ(*)が最も高い優先順位を持つことに同意することができるので、簡単にすることa[$0]ができますx

私はあなたが読んだ内容が正しいと言いたいと思います。++以下よりも優先順位が高くなります!

$ awk 'BEGIN{ x=123; tmp = !x++;  print tmp, x; }'
0 124
$ awk 'BEGIN{ x=123; tmp = !(x++);  print tmp, x; }'
0 124

もちろん。!x++値を取得しxて返し、値を増やします。戻り値は123否定され、生成されます0。増加した値は後で確認できますx

!しかし、より密接に統合された別の可能性も試してみましょう。

$ awk 'BEGIN{ x=123; tmp = (!x)++;  print tmp, x; }'
awk: cmd. line:1: BEGIN{ x=123; tmp = (!x)++;  print tmp, x; }
awk: cmd. line:1:                           ^ syntax error

まあ、そうです。今、この!値は最初に値を取得してxからそれを反転して返すため、機能しません0。もう少し増やさなければなりません++結果を再保存。しかし、0変数ではない値にすぎず、保存することはできません。したがって、エラーが発生しました。 (似ていると(1+2)++同じエラーが発生します。)

したがって、++優先順位が高いほど、返される値には明確ではない隠された副作用があります。

(*購読事業者は表示されません。優先順位テーブル標準ではC演算子優先順位テーブルただし、優先順位が低い場合、式は実際には機能しません。 )

おすすめ記事