再帰的な文字列長関数の評価は、C のコンパイル時に保証されていますか?

Mary-Kate Olsen
リリース: 2024-10-30 02:31:28
オリジナル
746 人が閲覧しました

Is the Evaluation of a Recursive String Length Function Guaranteed at Compile Time in C  ?

コンパイル時の C 文字列の長さの計算

C では、コンパイル中に文字列リテラルの計算を実行できます。次のコード スニペットを考えてみましょう:

<code class="c++">#include <cstdio>

int constexpr length(const char* str)
{
    return *str ? 1 + length(str + 1) : 0;
}

int main()
{
    printf("%d %d", length("abcd"), length("abcdefgh"));
}</code>
ログイン後にコピー

このコードは、再帰関数を利用して、コンパイル時に指定された文字列リテラルの長さを決定します。結果を出力することで、関数が文字列の長さ (つまり 4 と 8) を正しく計算していることを確認できます。結果として得られるアセンブリ コードは、これらの計算がコンパイル中に実行されることも示しています。

ただし、次の重要な疑問が残ります。この長さ関数の評価は、C 標準に従ってコンパイル時に行われることが保証されていますか?

答えは、予想されるほど単純ではありません。ドラフト C 標準 (セクション 5.19) によれば、定数式は「翻訳中に評価できる」とされています。ただし、これは単なる非規範的な注意事項であり、確実な保証ではありません。

コンパイル時の評価を確実にするために、次の 2 つの戦略を利用できます。

  1. 定数式を使用する: 配列の境界やケース ラベルなど、特定の式は標準に従って定数である必要があります。これらのコンテキストで length 関数を使用すると、コンパイル時の評価が保証されます。
  2. constexpr 変数を初期化します: length 関数の結果を constexpr 変数に代入すると、コンパイラは次の時点で関数を実行するように強制されます。

したがって、標準ではコンパイル時に長さ関数を評価することを明示的に義務付けていませんが、定数式として利用するか、constexpr 変数を初期化することで、そのような評価を強制することができます。この実践により、コンパイル中に文字列リテラルに対してハッシュの計算や複雑な文字列操作の実行など、高度な計算を実行できる可能性が広がります。

以上が再帰的な文字列長関数の評価は、C のコンパイル時に保証されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!