問題タブ [unspecified-behavior]
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 - 指定された初期化子を使用して配列を初期化する際の奇妙な値
以下の配列を初期化すると、 を除いてすべての出力が正常に見えますvalues[3]
。何らかの理由でvalues[3]
初期化されvalues[0]+values[5]
、非常に大きな数値が出力されます。私の推測ではvalues[0]+values[5]
、メモリに適切に保存される前に割り当てようとしているのですが、誰かがそれを説明できれば素晴らしいでしょう。
出力は次のとおりです。
c++ - シーケンス ポイントのあいまいさ、未定義の動作?
今日、clang++ (3.7-git)、g++ (4.9.2)、および Visual Studio 2013 で異なる動作を示すコードに出くわしました。いくつかの削減の後、問題を強調する次のスニペットを思いつきました。
g++ (4.9.2) では、次の出力が得られます。
そのため、g++ は引数をバッファに評価し、次に buffer(..) 自体を評価し、その後、インデックス引数を配列演算子に評価します。直感的にこれは理にかなっています。
clang (3.7-git) と Visual Studio 2013 の両方で次の結果が得られます。
私はclangとVS2013がバッファ(..)に落ちる前に可能なすべてを評価すると思います。これは私には直感的ではありません。
私の質問の要点は、これが未定義の動作の明確なケースであるかどうかです。
編集:これを片付けてくれてありがとう、そして不特定の行動は私が使うべきだった用語です。
c++ - C++でポインタ比較は未定義または未指定の動作ですか?
Stroustrup による C++ プログラミング言語第 3 版には、次のように書かれています。
ポインターの減算は、両方のポインターが同じ配列の要素を指している場合にのみ定義されます (言語には、そうであることを確認する高速な方法はありませんが)。あるポインターを別のポインターから減算すると、結果は 2 つのポインター間の配列要素の数 (整数) になります。ポインターに整数を加算したり、ポインターから整数を減算したりできます。どちらの場合も、結果はポインター値です。 その値が元のポインターと同じ配列の要素またはそれを超える要素を指していない場合、その値を使用した結果は未定義です。
例えば:
ウィキペディアで不特定の動作について読んでいました。それは言う
C および C++ では、オブジェクトへのポインターの比較は、ポインターが同じオブジェクトのメンバーまたは同じ配列の要素を指している場合にのみ厳密に定義されます。
例:
だから、私は混乱しています。どちらが正しいですか?ウィキペディアかストロストロップの本か?これについて C++ 標準は何と言っていますか?
何か誤解している場合は訂正してください。
angularjs - Angularディレクティブのデフォルトコントローラー
controllerAs
指定されていない場合、Angular ディレクティブ定義のデフォルトは何ですか?
c++ - 名前空間スコープ変数の C++ 初期化
次のプログラムを検討してください: (ここでライブデモを参照してください。 )
プログラムの出力を 3.0 として取得することを期待していましたが、出力が 0 になりました。なぜですか?
変数 d2 が静的に初期化されているように見えますか?
動的に初期化するべきではありませんか?
g++ 4.8.1、4.9.2、および MSVS 2010 でテストし、出力として 0 を取得しました。
c++ - C および C++ コンパイラが最適化されたコードを生成するのに役立つ関数引数の評価の正確な順序を指定しませんか?
上記のプログラムの出力はコンパイラに依存します。関数の引数が評価される順序は規定されていません。私がこれについて読んだ理由は、高度に最適化されたコードになる可能性があるからです。関数引数の評価の正確な順序を指定しないと、コンパイラは最適化されたコードを生成できませんか?
私の知る限り、評価の順序は、Java、C#、D などの言語で厳密に指定されています。
c - 評価の順序: 未定義の動作? またはコンパイラの欠陥?
C コンパイラから以下のテスト コードに対して間違った asm コードを取得しています。これは未定義の動作によるものですか?
基準とは:
6.5.16 代入演算子
オペランドの評価順序は規定されていません。代入演算子の結果を変更したり、次のシーケンス ポイントの後にアクセスしようとした場合の動作は未定義です。
C 演算子の優先順位規則
- ()
- ==
- || &&
問題の場合: if ( (a) || (b && c || d) == 1 ) コンパイラは次の順序で式を評価し、間違ったコードを生成します
1.(b && c || d) -->R1
2.R1 == 1 -->R2
3.(a) || R2
ただし、コンパイラは以下の場合に正しいコードを生成します
ケース 1: . 関係「==」演算がない場合
ケース 2:論理 OR 演算に括弧を追加する場合
ケース 3:演算間に括弧を使用しない
問題のケースが未定義の動作カテゴリに該当するかどうかを知りたいです。
よろしく、
マック