問題タブ [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.

0 投票する
1 に答える
1085 参照

c - Cでの暗黙の宣言

Undefined Behaviour次のプログラムはCで呼び出しますか?

上記のプログラムには暗黙の宣言がありprintf()ますが、上記のコードは完全に標準に準拠していますか、それとも実装固有の動作がありますか?

0 投票する
8 に答える
15845 参照

c++ - 「while(1);」を最適化する C++0xで

更新されました。以下を参照してください。

C ++ 0xを使用すると、コンパイラが次のスニペットの「Hello」を出力できることを聞いて読んだことがあります。

それは明らかにスレッドと最適化機能と関係があります。しかし、これは多くの人々を驚かせる可能性があるように私には思えます。

誰かがこれが許可するために必要だった理由の良い説明を持っていますか?参考までに、最新のC++0xドラフトは次のように述べています。6.5/5

forステートメントの場合のfor-init-statementの外側で、ループが発生します。

  • ライブラリI/O関数を呼び出さず、
  • 揮発性オブジェクトにアクセスまたは変更せず、
  • 同期操作(1.10)またはアトミック操作(29節)を実行しません

実装によって終了すると想定される場合があります。[注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラー変換を可能にすることを目的としています。—エンドノート]

編集:

この洞察に満ちた記事は、その標準のテキストについて述べています

残念ながら、「未定義動作」という言葉は使用されていません。ただし、標準で「コンパイラはPを想定する可能性がある」と記載されている場合は常に、プロパティnot-Pを持つプログラムのセマンティクスが未定義であることを意味します。

それは正しいですか、コンパイラは上記のプログラムに対して「Bye」を出力することを許可されていますか?


ここにはさらに洞察に満ちたスレッドがあります。これは、上記のリンクされた記事を行ったGuyによって開始された、Cと同様の変更に関するものです。他の有用な事実の中で、それらはC ++ 0xにも適用されるように見える解決策を提示します(更新:これはn3225ではもう機能しません-以下を参照してください!)

コンパイラはそれを最適化することを許可されていないようです。なぜなら、それはループではなく、ジャンプだからです。別の男がC++0xとC201Xで提案された変更を要約します

ループを作成することにより、プログラマーは、ループが目に見える動作(I / Oの実行、揮発性オブジェクトへのアクセス、同期またはアトミック操作の実行)で何かを実行するか、 最終的に終了することを表明します。副作用のない無限ループを記述してその仮定に違反した場合、私はコンパイラーに嘘をつき、プログラムの動作は未定義になります。(運が良ければ、コンパイラーはそれについて警告するかもしれません。)この言語は、目に見える振る舞いなしに無限ループを表現する方法を提供していません(もはや提供していませんか?)。


2011年3月1日にn3225で更新:委員会はテキストを1.10 / 24に移動し、次のように述べます。

実装では、任意のスレッドが最終的に次のいずれかを実行すると想定する場合があります。

  • 終了、
  • ライブラリI/O関数を呼び出します。
  • 揮発性オブジェクトにアクセスまたは変更する、または
  • 同期操作またはアトミック操作を実行します。

gotoトリックはもう機能しません!

0 投票する
4 に答える
8882 参照

c - Cでmainに引数の数を制限する

main()Cで渡す引数の数に制限はありますか?ご存知のように、それはとして定義されint main(int argc, char *argv[])ます。

プログラムを呼び出すと、次のような引数を渡すことができます。

このように提供できる引数の数に上限はありmain()ますか?

0 投票する
8 に答える
20653 参照

c++ - 左側のオペランドが負の値の場合、左シフト操作が未定義動作を呼び出すのはなぜですか?

Cでは、左側のオペランドが負の値の場合、ビット単位の左シフト演算によって未定義動作が呼び出されます。

ISO C99(6.5.7 / 4)からの関連する引用

E1 << E2の結果は、E1の左シフトE2ビット位置です。空になったビットはゼロで埋められます。E1に符号なしタイプがある場合、結果の値はE1×2 E2であり、結果タイプで表現可能な最大値より1を法として減少します。E1に符号付きタイプと非負の値があり、E1×2 E2が結果タイプで表現可能である場合、それが結果の値です。それ以外の場合、動作は定義されていません。

しかし、C ++では、動作は明確に定義されています。

ISO C ++-03(5.8 / 2)

E1 << E2の値は、E1(ビットパターンとして解釈される)の左シフトされたE2ビット位置です。空のビットはゼロで埋められます。E1がunsigned型の場合、結果の値はE1に数量2を掛けてE2の累乗になり、E1の型がunsignedlongの場合はULONG_MAX+1を法として、それ以外の場合はUINT_MAX+1になります。[注:定数ULONG_MAXおよびUINT_MAXはヘッダーで定義されています)。]

つまり、

Cでは未定義動作を呼び出しますが、動作はC++で明確に定義されています。

ISO C ++委員会が、Cでの動作とは対照的に、その動作が明確に定義されていると見なすようになったのはなぜですか?

一方、implementation defined左オペランドが負の場合の動作はビット単位の右シフト演算ですよね?

私の質問は、なぜ左シフト操作がCで未定義動作を呼び出すのか、そしてなぜ右シフト演算子が実装定義の動作だけを呼び出すのかということです。

PS:「標準がそう言っているので、それは未定義の振る舞いです」のような答えを与えないでください。:P

0 投票する
2 に答える
3542 参照

c++ - シーケンスされていない値の計算(別名シーケンスポイント)

このトピックをもう一度開いて申し訳ありませんが、このトピック自体について考えると、未定義動作が発生し始めました。明確に定義された動作のゾーンに移動したい。

与えられた

上記の表現を(この順序で)次のように考えます

ここでの動作については、 C++0xからの重要な引用です。

$ 1.9 / 12-「式(または部分式)の評価には、一般に、値の計算(左辺値評価のためのオブジェクトのIDの決定と、右辺値評価のためにオブジェクトに以前に割り当てられた値のフェッチを含む)と副作用の開始の両方が含まれます。 。」

$ 1.9 / 15-「スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用、または同じスカラーオブジェクトの値を使用した値の計算に比べて順序付けされていない場合、動作は定義されていません。」

[注:異なる引数式に関連する値の計算と副作用は順序付けられていません。—エンドノート]

$ 3.9 / 9-「算術型(3.9.1)、列挙型、ポインター型、メンバー型へのポインター(3.9.2)、std :: nullptr_t、およびこれらの型のcv修飾バージョン(3.9.3)はまとめて呼び出されますスカラー型。」

  • Expr1では、式i(最初の引数)の評価は、式(副作用があります)の評価に関して順序付けられていませんoperator++(i)

    したがって、Expr1の動作は未定義です。

  • Expr2では、式i(最初の引数)の評価は、operator++(i, 0)(副作用がある)式の評価に関して順序付けられていません。

    したがって、Expr2の動作は未定義です。

  • Expr3では、 outerが呼び出されるoperator++(i)前に、lone引数の評価を完了する必要があります。operator++

    したがって、Expr3の動作は明確に定義されています。

  • Expr4では、式i(最初の引数)の評価は、operator[](operator++(i, 0)(副作用があります)の評価に関して順序付けられていません。

    したがって、Expr4の動作は未定義です。

この理解は正しいですか?


PSOPのように式を分析する方法が正しくありません。これは、@ Potatoswatterのように、次のように述べているためです。「13.6節は適用されません。13.6/ 1の免責事項を参照してください。」これらの候補関数は、13.3.1.2で説明されている演算子のオーバーロード解決プロセスに参加し、他の目的には使用されません。 「これらは単なるダミーの宣言です。組み込み演算子に関しては、関数呼び出しのセマンティクスは存在しません。」

0 投票する
4 に答える
23506 参照

c - Cでの負の数の表現?

Cは負の整数をどのように表しますか?

2の補数表現によるものですか、それともMSB(最上位ビット)を使用したものですか?

-116進数ではffffffff

だから私のためにこれを明確にしてください。

0 投票する
3 に答える
431 参照

c++ - ISOCでの配列の左辺値から右辺値への変換

C ++ ANSI ISO IEC 14882 2003 Annex C.1(668ページ):

変更:条件式、代入式、またはコンマ式の結果は、左辺値である可能性があります
。理論的根拠:C + +はオブジェクト指向言語であり、左辺値に比較的重点を置いています。たとえば、関数は左辺値を返す場合があります。
元の機能への影響:明確に定義された機能のセマンティクスに変更します。左辺値から右辺値への変換に暗黙的に依存する一部のC式では、異なる結果が得られます。例えば、

C++およびCで100を生成しsizeof(char*)ます
。..。

私はちょうど今日これを読んでいて、数ヶ月前に私の友人が問題を提案したことを思い出しました。それは、C ++でコンパイルされた場合は0を返し、Cでコンパイルされた場合は1を返す関数を書くことでした。これは、Cでは構造体が外部スコープにあるという事実を利用しています。したがって、この新しい情報を考慮して、これはMicrosoft Visual Studio 2008で試した上記の問題の別の解決策になると判断しましたが、CまたはC ++コードとしてコンパイルされているかどうかに関係なく、sizeof(0, arr)常に4が生成されます。

1.ISO Cとは何ですか?それは現在のC標準ですか?それだけですか(Cは急速に進化していると聞きました)2。これはMicrosoft C ++のバグですか?

TIA

編集:申し訳ありませんが、出力と混同して編集しました:

0 投票する
7 に答える
4352 参照

c++ - 基本クラスとしてのユニオン

規格では、ユニオンを基本クラスとして使用できないと定義されていますが、これには特定の理由がありますか?私が理解している限り、Unionにはコンストラクタ、デストラクタ、メンバー変数、およびそれらの変数を操作するためのメソッドを含めることができます。つまり、Unionは、メンバー関数を介してアクセスされる可能性のあるデータ型と状態をカプセル化できます。したがって、最も一般的な用語では、クラスとしての資格があり、クラスとして機能できる場合、なぜ基本クラスとしての機能が制限されているのでしょうか。

編集:答えは理由を説明しようとしますが、派生クラスとしてのユニオンが単なるクラスとしてのユニオンよりも最悪であるかどうかはまだわかりません。それで、より具体的な答えと推論を得ることを期待して、私はこれを賞金のためにプッシュします。すでに投稿された回答に違和感はありません、それらに感謝します!

0 投票する
1 に答える
634 参照

c++ - 匿名の空のタグなしクラス、構造体、共用体、および列挙型

!免責事項! :タグなし宣言について話していることに注意してください。私はそれがおそらく非公式の用語であることを知っています。それが意味することは、宣言が typedef ではなく、匿名型のオブジェクトを宣言しないということです。これらの場合、すべてが明確です。

質問 1:
次のうち、整形式の C++ プログラムはどれですか? (複数の選択肢)

備考:
MSVC9.0 は 3 つすべてを受け入れます。最初は警告が表示されます。2 番目と 3 番目では、0 個のエラーと 0 個の警告が表示されます。オンライン コモーは 3 番のみを受け入れ、1 番と 2 番はコンパイルに失敗し、「宣言は何も宣言しません」という診断メッセージが表示されます。2 番目の匿名列挙に少なくとも 1 つの列挙子が含まれている場合、2 番目は comeau コンパイラによって正しく受け入れられます。

comeau コンパイラが正しく、これが標準の動作である場合、矛盾が見られます。ナンバーワンが拒否されるべき理由は理解できます。2 番目を拒否する理由 (何も宣言しない) も理解できますが、この場合は 3 番目も拒否する必要があります。そして、3 番目が拒否されるべきではない場合、1 番目との唯一の違いは、無名共用体のメンバーのスコープが外側のスコープであることです。しかし、それは列挙型にも当てはまります。したがって、私の主張は、3 番目が受け入れられるべきであり、2 番目が受け入れられるべきであるということです。

質問 2:
コモーが正しい場合、上記の判断に欠けている考慮事項は何ですか?

PS comeau サポートにメールを書きました。回答が得られたらすぐに投稿します。

0 投票する
7 に答える
9985 参照

c - C プログラムに main() は必要ですか?

タイトルがすべてを物語っています。関数はmain()Cプログラムにとって絶対に不可欠ですか?

これを尋ねているのは、Linux カーネル コードを見ていましたが、main() 関数が表示されなかったからです。