問題タブ [constant-expression]

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 に答える
4405 参照

delphi - Delphi 定数式が必要です

次のコードで「定数式が必要です」というエラーが表示されます。

TBoardと定義されている:

マークされた行でエラーが発生します。

誰かが何が起こっているのか知っていますか?
前もって感謝します!

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

c# - C# コンパイラまたは JIT はラムダ式のメソッド呼び出しを最適化できますか?

別の StackOverflow の質問で (コメントで)開始されたディスカッションの後に、この質問を開始しています。答えを知りたいと思っています。次の式を検討します。

この場合、評価を Where 句の外に移動する (パフォーマンス) 利点はありますかListOfDates.Max()、それとも 1. コンパイラまたは 2. JIT がこれを最適化しますか?

私は、C# はコンパイル時にのみ定数の折りたたみを行うと考えており、ListOfDates 自体が何らかの形で定数でない限り、ListOfDates.Max() はコンパイル時に認識できないと主張できます。

おそらく、これが一度だけ評価されるようにする別のコンパイラ (または JIT) の最適化があるでしょうか?

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

c - C での最小保証定数フォールディング

質問

Cで行われる一定の折り畳みについて保証があるかどうか、私は興味があります.

私が見たところ

私には評判が不明なサイトのこのリンクは、率直なコメントをしています。

すべての C コンパイラは、マクロ展開後に存在する整数定数式を折りたたむことができます (ANSI C 要件)。

しかし、たとえば The C Programming Language, second edition (ANSI C のすべての詳細を説明するために完全に更新されたと思います) には何も表示されません。しかし、関連する単語への参照のインデックスをチェックした後、これを約束するものは何も見つかりませんでした. 特に38ページと209ページは、コンパイル時に評価できる任意の式を、定数を使用できる場所で使用できると述べているため(十分に知識があれば、おそらくいくつかの制限があります)、そのような式は次のように述べています。 " may " はコンパイル時に評価されますが、"will"/(いくつかの同義語) ではありません。

この C89 最終案を検索しました。"folding" と "folded" という単語では値の結果が得られず、"constant expression" で検索すると 63 件の一致が生成され、そのうちの約半分を調べました。興味のある主要な部分は基本的に本と同じようです ( 「かもしれない」の代わりに「できる」という言葉を使用していますが、この文脈ではそれらは同義です)。

これらはどちらも、すべての ANSI C コンパイラが基本的な定数折りたたみ機能を備えている必要があることを論理的に強く暗示しているように思われますが、同時に、定数式を式を計算するコードにコンパイルすることに対する厳しい禁止事項はないようです。実行時 (このような実装でも、定数式の利点が得られます。これは、コンパイラが定数式を一度計算すると、値が変化しないと想定するコードを生成できるためです。また、そのような実装は、特定の基礎となるアーキテクチャ (たとえば、いくつかの RISC アーキテクチャ) の制限によって強制される可能性があります。可能な値を初期化するために 2 つの命令を使用するか、メモリ位置からそれらをロードする必要があります)。

この C99 最終ドラフトも簡単に検索しましたが、"folding" は価値のない結果を 1 つ得ましたが、"folded" と "constant" にはそれぞれ 100 以上の一致があり、現在クロールする時間を割り当てることができませんでした。

動機

これらのマクロは、ビットをいじるコードでよりセマンティック/意図を明確にするために作成しました。

..wherenは常に整数リテラルです。私は安心したいのですが、「大丈夫です。リモートで重要な使用中のすべての C コンパイラがこれらの定数を折りたたんでくれます」という安心できる声を聞きたいです。(追記: ビットが 0 番目または 1 番目のビットから始まるUCHAR_NTH_BIT_mかのように動作するかどうかについて、別の質問をしました。できれば適切な場所で行います。)

そして、はい、一番下のものは別のマクロに変えることができます。たとえば、コードでたまたま必要なマクロを#define UCHAR_1ST_BIT_m (unsigned char )1介して#define UCHAR_3RD_BIT_m (unsigned char )4、または必要に応じて多くのマクロを作成できます-そして、それらのどれが優れているかについては未定ですが、おそらく議論の余地があります。優れたペダンティック言語弁護士タイプの C プログラマーになるためには、一番上のものを正確に避けることはできません (これらの DSP/組み込みおよび古代のメインフレーム C 実装でコードが正しいことを実行することを確認する必要があります)。

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

c - この追加が黙って無視されているのはなぜですか?

私は次のCコードを持っています:

これを (C または C++ として) Microsoft Visual Studio Community 2015 でコンパイルして実行すると、出力は次のようになります。

+ 0x8000000000000000の上位ビットを設定することを期待していたコードは、a[1]黙って無視されたようです。

ただし、a内部の初期化を移動するmainと、出力は期待どおりになります。

グローバルでaは、追加が黙って無視されるのはなぜですか? 試行された追加は、実際に上位ビットを設定するa[1]必要がありますか、それともコンパイラ エラーを引き起こす必要がありますか?

興味深いことに、+ 0x8000000000000000上記のコードを に置き換えると| 0x8000000000000000、「エラー C2099: 初期化子が定数ではありません」というメッセージが表示されます。

編集:キャストがなくても同様の問題が発生する可能性があります。x64 用にコンパイルされた次のコードは、同じ値 (例: 000000013FB8D180) を 3 回出力します。

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

c++ - static const std::string を作成すると例外が発生するのはなぜですか?

アプリの複数の場所で使用する文字列用の文字列定数があります。

別の質問 (コンパイル中にターゲットに含まれていない .h ファイルはどうなりますか? )について質問を投稿すると、別のユーザーが次のコメントを作成しました。

この場合、静的文字列はグローバルであることに注意してください。したがって、それらはいつでも例外を作成する可能性があり、キャッチすることはできません。文字列の参照を返す関数を使用することをお勧めします。std::string const &mystring { static std::string const mystring = "IamAwesum"; このようにして、オブジェクトは必要なときにのみ構築されます

上記の方法で static const 文字列を使用すると、例外がスローされるリスクがある理由を誰かが説明できますか?