問題タブ [language-lawyer]
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言語での不特定の動作の例は、関数への引数の評価の順序です。それは左から右または右から左かもしれません、あなたは知らないだけです。foo(c++, c)
これは、評価方法や評価方法に影響しますfoo(++c, c)
。
知らないプログラマーを驚かせる可能性のある他の不特定の動作はありますか?
c++ - 確実に残るC++0xの機能はどれですか?
確かに存在することが知られている C++0x の機能はありますか? 標準ライブラリのスレッドのように?
c - 配列型とポインタ型は C コンパイラで内部的にどのように処理されますか? ( int *a; 対 int a[]; )
信頼できる情報源を持つ言語弁護士が必要です。
gcc で問題なくコンパイルされる次のテスト プログラムを見てください。
それは私が期待する出力を生成します:
a と b は同じ型ですか? コンパイラ内部で int *a
同じ型として扱われる?int a[]
実用的な観点からは、int a[100], b[500], *a_p, b_a[];
すべて同じタイプに見えます。上記の例のさまざまな状況で、コンパイラがこれらの型を常に調整しているとは信じがたいです。間違っていることが証明されてうれしいです。
誰かが私のためにこの質問を決定的かつ詳細に解決できますか?
c++ - 信じられないほど高速な C++ デリゲートとさまざまな翻訳単位
Sergey Ryazanov によると、彼の信じられないほど高速な C++ デリゲートは比較できません。
私の代理人は比較できません。デリゲートにはメソッドへのポインターが含まれていないため、比較演算子は定義されていません。スタブ関数へのポインターは、さまざまなコンパイル単位で異なる場合があります。
読者はどれに答えましたか:
「スタブ関数へのポインターは、さまざまなコンパイル単位で異なる場合があります。」私の知る限り、これは真実ではありません。コンパイラは、異なるコンパイル単位で生成されたテンプレート関数を再利用する必要があります (これは確かですが、Borland はかつてこの規則に違反したと思います)。クラス(「名前のない」名前空間にないクラス)が外部リンケージを使用し、スタブ関数の使用方法が常にインライン化を妨げるためだと思います(ただし、関数のアドレスを取得するため、これは問題にはなりません非インライン バージョンが強制的に生成され、リンカーによって実行される「外部リンケージ」により、類似した名前の関数が 1 つを除いてすべて削除されます (それらは標準によって同一であると想定され、要求されます)...
テンプレート関数を 1 つの翻訳単位 (cpp ファイル) で定義し、同じ関数を別の翻訳単位で別の方法で定義すると、2 つのバージョンのうち 1 つのみが最終的な実行可能ファイルになります。(これは実際には「1 つの定義規則」に違反しますが、少なくとも GCC では動作します... MSVC については不明です。) 要点: [スタブの] アドレスは異なるユニットで同じになります。
これが MSVC に当てはまると思われる場合は、(比較機能を含めて) 記事を更新することをお勧めします。MSVC がこの点で標準の授与である場合。
現在、この記事は 4 年前に作成されており、著者は過去 3 年ほどコメントに返信していないため、上記のコメントにメリットがあるかどうか、およびこの特定の実装を実際に変更できるかどうか疑問に思っています。比較をサポートします。
C++ 標準はそのような使用法を具体的に禁止していますか? もしそうなら、最近のコンパイラは実際にその点で標準に準拠していますか?
c++ - 空隙の大きさは?
このステートメントは何をもたらすでしょうか?
編集:質問の延長。
GCC コンパイラで sizeof(void) が 1 を返す場合、1 バイトのメモリが割り当てられ、ポインタ p はそのバイトを指し、p++ は 0x2346 にインクリメントされますか? p が 0x2345 であるとします。*p ではなく、p について話しているのです。
c++ - reinterpret_cast を使用する代わりに void* を介してキャストする
私は本を読んでreinterpret_cast
いますが、直接使用するべきではなく、 void* と組み合わせてキャストする必要があることがわかりましたstatic_cast
:
それ以外の:
ただし、これが直接キャストよりも優れている理由の説明が見つかりません。誰かが私に説明をしてくれたり、答えを教えてくれたりすると、とても感謝しています。
前もって感謝します
ps何にreinterpret_cast
使われるかは知っていますが、このように使われているのを見たことがありません
c++ - シーケンスポイントと半順序
数日前、ここで表現が
i = ++ i + 1
UB(未定義動作)を呼び出すかどうか。
最後に、「i」の値が2つのシーケンスポイント間で複数回変更されているため、UBを呼び出すという結論に達しました。
私は同じスレッドでJohannesSchaubとの話し合いに参加しました。彼によると
i =(i、i ++、i)+1 ------(1)/*UBも呼び出します*/
前の部分式の副作用は、iとi++の間およびi++とiの間のコンマ演算子'、'によってクリアされるため、(1)はUBを呼び出さないと言いました。
それから彼は次の説明をしました:
「はい、i ++の後のシーケンスポイントは、その前にすべての副作用を完了しますが、割り当ての副作用がi ++の副作用と重なるのを止めるものは何もありません。根本的な問題は、割り当ての副作用が、または割り当ての両方のオペランドの評価の前に、したがってシーケンスポイントはこれを保護することに関して何もできません:シーケンスポイントは半順序を誘発します:i ++の前後にシーケンスポイントがあるからといって、すべての副作用がシーケンスされるわけではありません私に関して。
また、単にシーケンスポイントは意味がないことに注意してください。評価の順序は、コードの形式によって決定されません。これは、セマンティックルールによって決定されます。この場合、そのオペランドまたはそれらのオペランドの部分式の両方を評価することに関して、割り当ての副作用がいつ発生するかを示す意味規則はありません。
「太字」で書かれた声明は私を混乱させた。私の知る限りでは:
「シーケンスポイントと呼ばれる実行シーケンスの特定の指定されたポイントで、前の評価のすべての副作用が完了し、後続の評価の副作用が発生していないものとします。」
コンマ演算子も実行順序を指定するので、最後のiに到達したときにi ++の副作用はキャンセルされました。評価の順序が指定されていなければ、He(Johannes)は正しかったでしょう(ただし、コンマ演算子の場合は適切に指定されています) )。
だから私は(1)UBを呼び出すかどうかを知りたいだけですか?誰かが別の有効な説明をすることができますか?
ありがとう!
c++ - C ++で未使用の変数の警告を抑制=>コンパイラのバグまたはコードのバグ?
現在、未使用の変数の警告を抑制するために、次の関数テンプレートを使用しています。
ただし、Linuxからcygwinに移植すると、g ++ 3.4.4でコンパイラエラーが発生します(Linuxでは3.4.6なので、これはバグ修正ですか?):
usedの引数は、次のように宣言されたメンバー変数です。
これはコンパイラのバグですか、それとも私のコードのバグですか?
最小限のテストケースは次のとおりです。
c - Cのmain()関数の有効な署名は何ですか?
Cのmain関数の有効な署名は実際には何ですか?知っている:
他に有効なものはありますか?
c++ - C++ で unsigned char 型の整数リテラルを指定するにはどうすればよいですか?
次のように、unsigned long 型の整数リテラルを指定できます。
unsigned char についても同様にするにはどうすればよいですか?
これは、コンパイラの警告を回避するために必要です。
現在持っている冗長な回避策を回避し、別の行の変数で 9 を宣言せずに min を呼び出す行に「unsigned char」が表示されないようにしたいと考えています。