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演算子優先順位テーブルただし、優先順位が低い場合、式は実際には機能しません。 )