8

このフォーラムの非常に評判の良い寄稿者"R.."が、2 日前にはっきりと私にこう言いました。

Initializers for objects of static storage duration must be constant expressions. The result of a function call is not a constant expression.

彼はグローバル変数について話していました.しかし、main()関数内で宣言された定数、またはその問題に関する関数がどうなるかはわかりません.関数内で宣言された定数についてもそうであると直感的に感じますが、次のプログラムは次のリンクからソースされています、おそらくcorrect答えで、私を混乱させています。

http://www.indiabix.com/c-programming/const/discussion-546

#include<stdio.h>
int get();

int main()
{
    const int x = get();
    printf("%d", x);
    return 0;
}

int get()
{
    return 20;
}

それでは、戻り値を定数に代入することがCで有効かどうかを誰かが説明できますか?

4

3 に答える 3

1

私があなたを混乱させていると思うのは、タイプ修飾子 constストレージクラス指定 static子を混同していることです。これらはまったく異なる機能であり、互いに比較することはできません。

const変数は、宣言されたスコープ内で読み取り専用であり、初期化されたときにのみ値を与えることができることを意味します。つまり、const変数が定義されたのと同じ行です。それは他に何の意味もありません。

静的保存期間とは、プログラムの実行全体を通じて変数が存在することを意味します。として宣言されているstaticすべての変数と、ファイル スコープ (「グローバル」) で宣言されているすべての変数には、静的なストレージ期間があります。前述のように、静的ストレージ期間を持つ変数は、定数式でのみ初期化できます。これは、 として宣言された読み取り専用変数と混同しないでくださいconst

それでは、戻り値を定数に代入することがCで有効かどうかを誰かが説明できますか?

場合によります。

  • ファイル スコープで宣言された変数には、静的な保存期間があります。
  • 静的ストレージ期間を持つ変数は、定数式で初期化する必要があります。
  • 関数からの戻り値は定数式ではありません。
  • したがって、静的ストレージ期間を持つ変数は、関数からの戻り値で初期化できません。

ご覧のとおり、これはconstキーワードとは関係ありませんが、変数が宣言された場所と関係があります。変数constがローカルスコープ内で宣言されているかどうかにかかわらず、コード例で示されているように、任意の値で初期化しても問題ありません。

于 2013-04-26T13:53:01.287 に答える