問題タブ [postfix-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C ++でデクリメント/インクリメント後置演算子を使用するときのリスクを防ぎますか?
最近、私は次のようにstを使用するときにリスクを見つけました:
実際には合計=9+ 8 + 7 + .. + 1になります。したがって、合計で10が不足しています。しかし、私はこのコーディング方法を好みます。それは高速でプロフェッショナルです。リスクを防ぎ、簡潔なコードを維持するためのアドバイスはありますか?
c++ - 後置 operator++ が前置 operator++ よりも優先されるのはなぜですか?
このように定義すると、どちら++x++
も実行できません++x--
。一方、(++x)++
とはどちら(++x)--
も便利な式です。は 2(++x)++
ずつインクリメントx
し、「中間」の値を返します。 while(++x)--
は と本質的に同等ですが、x+1
を呼び出す必要が完全に回避されますoperator+
。これは場合によっては非常に便利です。
では、優先順位がではなくに++x++
自動的に展開されるように定義されていないのはなぜですか? 後者には私が理解できない隠された意味がありますか、それとも単一のレベルを構成するすべてのプレフィックス演算子を含む単純なリストの優先順位を維持するためですか?(++x)++
++(x++)
編集OK、明示的には言いませんでしたが、もちろん、x
ユーザー定義型になるつもりでした。組み込み型の場合、(x+=2)-1
はもちろん よりも優れており、(++x)++
よりもはるかに優れています。私が念頭に置いている状況は、かなり複雑なタイプの半連想コンテナーへのイテレーターであり、オペレーターと(ランダムアクセス用に設計されている) は、一般的な要求に対して効率的に機能するためにキャッシュを再構築する必要があり、したがって命令です。よりも遅い大きさです。もちろん、引数が非常に小さい整数であるかどうかを常に最初に確認するように変更できます。その場合は、単に呼び出しますx+1
(++x)--
+=
+
++
operator++
ランダムアクセス手順を実行する代わりに、繰り返し。operator+=
ここでは問題なく機能するはずですが、提示する数値がどれほど小さいかに関係なく、ある時点で常にランダムアクセスの方法を使用したい状況が発生する可能性があると想像できます.
だから...私にとって、私は答えを次のように結論付けます:
すべての後置演算子が前置演算子の前に来る、単純で覚えやすい優先順位リストを持つ利点は、前置演算子と後置演算子/を構成するために常に括弧を使用しなければならないという小さな欠点を許容するのに十分です。めったに使用されません。
++
--
より単純な「C はこのように行う」というのは、本当の理由のように思われますが、私には満足のいくものではありません。なぜなら、 C ではまったく++x++
許可されていなかったので、この構成そのものを再定義することができたからです。既存のコード。
とにかく、(++x)--
かっこはそれほど痛くないので、引き続き使用します。
python - pyparsingの問題
今、私はpyparsing
単純な接尾辞式を解析するために使用し始めたところです。現時点では、私はここまで到達しました:
しかし、実行すると、次のように出力されます。
私は何が間違っているのですか?
java - Java での ++ および -- 演算子の優先順位
Java の公式チュートリアルから、接頭辞と後置 ++ の優先順位が異なることを読みました。
接尾辞: expr++ expr--
単項: ++expr --expr +expr -expr ~ !
チュートリアルによると、これはすべきではありません
d = 1; System.out.println(d++ + ++d);
4 の代わりに6 ( d++
d を 2 にして 3 にする) を出力しますか?++d
++d
事前に評価されるという説明は知っていますが、d++
優先順位が高い場合++d
、なぜd++
最初に評価されないのですか? さらに、どのような場合にd++
優先度が高いことを示す必要がありますか?
編集:
私は次のことを試しました:
d = 1; System.out.println(++d * d++);
4 を返します。1*3 ではなく 2*2 のようです。
c++ - コンパイラがプリインクリメント/デクリメントとポストインクリメント/デクリメントを解釈する方法
ポスト インクリメント/デクリメントとプリ インクリメント/デクリメントの違いについて誰かが尋ねると、通常、プレフィックス バージョンでは変数に 1 を追加して変数の新しい値を返すのに対し、ポストフィックス バージョンでは変数に 1 を追加してから返すという回答が返ってきます。古い値を返します。
いじり回しているうちに、これらの行はすべて合法であることがわかりました。
ただし、次の行はどれも有効ではありません。
接頭辞のバージョンが参照によって返されると仮定すると、これはすべて理にかなっています (接尾辞は接頭辞よりも優先されるため、最後の例でも)。
プレフィックス バージョンが参照を返し、ポストフィックス バージョンが値を返すという仮定/実現は正しいですか? pre/post inc/decrement 演算子について、私が知らない他の微妙な動作の違いはありますか?
c - エラーになる parseInt への後置
行: n2[i-dec-1] = parseInt(n2[i-dec-1])++;
エラー: 「後置操作の左側の式が無効です。」
解決策: n2[i-dec-1] = parseInt(n2[i-dec-1])+1;
postfix が配列からの parseInt 値に問題を抱えている理由が知りたいです (これは 0 に解決されます)。
答え: 整数への接尾辞は適切ではないことがわかりました。そのプロセスがエラーになること。
c - 前置演算子と後置演算子の違いは何ですか?
次のコードは値 9 を出力します。なぜですか? ここでreturn(i++)
は値11が返され、値--i
自体が10であるため、これがどのように機能するか説明できますか?
c# - Postfix ++/-- が C# の主要な演算子として分類されるのはなぜですか?
現在、私は C++ プログラマーのクラスに C# 言語の基礎を教えています。トピック演算子について説明したとき、私は主、単項などの演算子の C# 標準カテゴリを使用しました。
出席者の 1 人は戸惑いました。C# 標準では、「接頭辞 ++/--」ではなく、「接尾辞 ++/--」が主要な演算子のカテゴリに入れられたためです。この混乱の背後にある彼女の理論的根拠は、演算子「接頭辞 ++/--」に関して C++ 演算子「接尾辞 ++/--」を実装したいというものでした。言い換えれば、彼女は演算子「接頭辞 ++/--」を主要な演算子として数えたいと考えています。- 彼女の主張は理解できるが、その背後にある論理的根拠を彼女に与えることはできない. OK 演算子「接尾辞 ++/--」は「接頭辞 ++/--」よりも優先順位が高いですが、これがその背後にある唯一の根拠ですか?
仕様では、セクション「14.2.1 演算子の優先順位と結合性」で言及されています。
だから私の非常に中立的な質問: Postfix ++/-- が C# の主要な演算子として分類されるのはなぜですか? そこにはもっと深い真実がありますか?
c++ - 接尾辞と接頭辞の演算子のオーバーロード
次のコードを検討してください
ここでは、2つのバージョンの接尾辞と接頭辞の演算子が実装されています。違いは別のいわゆるダミー引数を導入することによって生じることを読みましたが、これらの宣言が表示されるかどうか疑問があります
それらは&マークで異なるので、なぜダミー引数が必要なのですか?また、どちらの場合も、たとえば++演算子は引数の前に記述され、それらが同じであることを意味しませんか?
java - Java接尾辞区切り文字
長い間Lのように、ソースコードで使用されている定数のタイプを示すには、接尾辞の区切り文字を使用する必要があります。ただし、shortsとbytesには区切り文字がないため、次のように定数値を明示的にキャストする必要があります。
Javaがコンパイルされたバイトコードでこれを実際に整数型から短整数型に変換するために追加の手順を実行するのか、それともこれが単語に収まり定数をそのまま使用するのかを知っているのでしょうか。それ以外の場合、これらのような数字を後置してショートまたはバイトを示す方法はありますか?