問題タブ [comma-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の例でトリッキーな質問のための本を提案する
重複の可能性:
「、」演算子はCで何をしますか?
さて、今日インタビューをしました、そして彼らは私に次のコードの出力はどうあるべきか尋ねました
自分のマシンで実行した後、答えを得ることができましたが、そこで答えることができませんでした。そのようなifステートメントが許可されているかどうか知りたいですか?どこに記載されていますか?
私の問題は、上記のif条件が、ifステートメントがどのように機能するかを理解できないことです。
**更新**
K&Rでそのようなものは見つかりませんでした。誰もが良い本を推薦できます。私は物事をプログラムしましたが、Cは初めてではありませんが、この質問に失敗した後も、Cの概念をさらに詳しく調べたいと思います。 (特に上記のような)どこで読むことができますか。
c++ - C ++のコンマ演算子とコンマ区切り
重複の可能性:
コンマ演算子がコンマ演算子として機能しないのはいつですか?
コンマ(,)はいつ演算子として動作し、いつセパレータとして動作しますか?そして、その結果はどうなりますか.可能であれば、両方の小さな例も挙げてください.
c++ - コンマ演算子のオーバーロードは *本当に* そのオペランドの評価の順序に影響しますか?
コンマ演算子は、左から右への評価順序を保証します。
[n3290: 5.18/1]
: コンマ演算子は左から右にグループ化します。コンマで区切られた式のペアは、左から右に評価されます。左の式は破棄された値の式です (箇条 5)。左の式に関連付けられたすべての値の計算と副作用は、右の式に関連付けられたすべての値の計算と副作用の前に並べられます。結果の型と値は、右側のオペランドの型と値です。結果は、右オペランドと同じ値カテゴリであり、右オペランドが glvalue とビット フィールドの場合はビット フィールドです。
演算子に関する他の唯一の句は、評価順序について言及していません。そのため、オペレーターが過負荷になっている場合でも、これが当てはまるようです。
しかし、さらに上の式に関する一般的な話では、もちろん、演算子をオーバーロードするとルールが変わることが述べられています。
[n3290: 5/2]:
[注:演算子はオーバーロードできます。つまり、クラス型 (第 9 節) または列挙型 (7.2) の式に適用すると意味が与えられます。オーバーロードされた演算子の使用は、13.5 で説明されているように関数呼び出しに変換されます。オーバーロードされた演算子は、5 節で指定された構文の規則に従いますが、オペランドの型、値のカテゴリ、および評価順序の要件は、関数呼び出しの規則に置き換えられます。++a
意味などの演算子間の関係はa+=1
、オーバーロードされた演算子 (13.5) に対して保証されておらず、型 のオペランドに対して保証されていませんbool
。—終わりのメモ]
ただし、これは非規範的なテキストです。このルールを定義する規範的なテキストはありますか、または準拠したコンパイラはそれを無視できますか?
c++ - カンマ演算子の使用を禁止する
カンマ演算子は使用しません。
しかし、時々、再帰を書くとき、私はばかげた間違いをします:私は関数名を忘れます。そのため、再帰呼び出しの結果ではなく、最後のオペランドが返されます。
簡略化した例:
正しくない、デバッグが難しいコードではなく、コンパイルエラーが発生する可能性はありますか?
c++ - カンマを使用したこの二重初期化が不正なのはなぜですか?
3つのコードスニペットがあります。これです:
大丈夫コンパイルします。これです:
コンパイルも大丈夫です。しかし、これは:
コンパイルに失敗します。gcc-4.3.4は言う
エラー:数値定数の前に非修飾IDが必要です
そしてVisualC++10は言う
エラーC2059:構文エラー:'定数'
なぜそのような違い?,
3つすべてが同じ効果でコンパイルされないのはなぜですか?
c++ - 次のコードでコンパイルエラーが発生しないのはなぜですか?
VS2005コンパイラを使用していますが、次のコードでコンパイルエラーが発生することが予想されます。
アフターアサインメントの値は3です。私の理解によると、コンパイルエラーが発生するはずです。
この背後に正当な理由があるかどうかを知りたいと思います。
c++ - 実装はコンマのオーバーロードから身を守る必要がありますか?
たとえばuninitialized_copy
、標準では次のように定義されています。
効果:
文字通り理解されている場合、これはを呼び出すための要件ですoperator ,(ForwardIterator, InputIterator)
。実際、このコードはHello world!
10回出力されます。
ただし、他のほとんどのアルゴリズムでは、標準は散文で説明を提供します。たとえば、copy
演算子,
を呼び出す必要はありません。しかし、私が変更した場合
上記のコードで
その後Hello world!
も10回印刷されます。上記の結果は、VS2005とGCC4.3.4の両方で観察できます。しかし、私が書くと
代わりに、VS2005はHello world!
10回印刷しますが、GCCは印刷しません。
残念ながら、標準operator,
でイテレータ型のオーバーロードが禁止されている場所が見つかりませんでした。それどころか、実装が上記のように呼び出しを行うことを禁止しています[global.functions]:
特に指定がない限り、標準ライブラリのグローバル関数と非メンバー関数は、引数依存の名前ルックアップ(3.4.2)で見つかった別の名前空間の関数を使用してはなりません。
では、MSVC、GCC、ISO、または私という4つのパーティのうち誰が間違っているのでしょうか。(1つ選択してください)
javascript - Javascriptの「タプル」表記:そのポイントは何ですか?
wtfjsで、私は以下が合法的なjavascriptであることを発見しました。
引数(null,'cool',false,NaN,4)
は私にはタプルのように見えますが、javascriptにはタプルがありません!
私のjavascriptコンソールでいくつかの簡単なテストを行うと、次のようになります。
セミコロンで区切られたステートメントのリストとまったく同じように動作し;
、最後のステートメントの値を返すだけのようです。
この構文とそのセマンティクスを説明するリファレンスはどこかにありますか?なぜそれが存在するのですか、つまりいつ使用する必要がありますか?
c - C で誤った多次元配列変数が増加する
私は、以下のように増加した多次元配列の C での動作を知りたいと思っています。
私はそれが間違った方法であることを知っています。この場合にコンパイラが何をするのか、プログラマが自分のコードでこれを行うとどうなるかを知りたいだけです。