85

この質問は、C ++ 11が承認される前、およびautoキーワードの意味が大幅に変更される前の2009年に最初に投稿されたことに注意してください。提供された回答は、C ++ 03の意味(指定されたストレージクラスである)にのみ関係し、C ++ 11の意味(自動型推論)には関係しません。C ++ 11をいつ使用するかについてのアドバイスを探している場合、この質問はその質問とは関係ありません。autoautoauto

staticブロックスコープの外で宣言された変数は暗黙的にグローバルであるため、長い間、Cでキーワードを使用する理由はないと思っていました。次に、変数をstaticブロックスコープ内として宣言すると永続的な期間が与えられ、ブロックスコープ外(プログラムスコープ内)で宣言するとファイルスコープ(そのコンパイルユニットでのみアクセス可能)が得られることを発見しました。

したがって、これにより、私が(おそらく)まだ完全には理解していないキーワードが1つだけ残ります。それはautoキーワードです。「ローカル変数」以外の意味はありますか?あなたがそれを使いたいと思うかもしれないところはどこでもあなたのために暗黙のうちに行われていないことは何ですか?auto変数はプログラムスコープでどのように動作しますか?static autoファイルスコープの変数はどうですか?このキーワードには、完全を期すために存在する以外の目的がありますか?

4

10 に答える 10

85

C ++ 11では、auto新しい意味があります。変数の型を自動的に推測できるようにします。

なぜこれまでに役立つのですか?基本的な例を考えてみましょう。

std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
  // Do stuff here
}

そこautoにタイプのイテレータが作成されますstd::list<int>::iterator

これにより、非常に複雑なコードがはるかに読みやすくなります。

もう一つの例:

int x, y;
auto f = [&]{ x += y; };
f();
f();

そこで、autoラムダ式を変数に格納するために必要なタイプを推定しました。ウィキペディアはこのテーマについてよく取り上げています。

于 2012-06-14T21:49:58.153 に答える
75

autoストレージクラス指定子、、staticなどもregisterありexternます。宣言では、これら4つのうち1つしか使用できません。

ローカル変数(なしstatic)には自動保存期間があります。つまり、定義の開始からブロックの終了まで存続します。とにかくそれがデフォルトであるため、それらの前に自動を置くことは冗長です。

C++で使用する理由はわかりません。暗黙のintルールを持つ古いCバージョンでは、次のように、それを使用して変数を宣言できます。

int main(void) { auto i = 1; }

有効な構文にするかi、スコープ内にある場合に代入式から曖昧さを解消します。ただし、これはC ++では機能しません(タイプを指定する必要があります)。面白いことに、C++標準は次のように書いています。

ブロックスコープでstorage-class-specifierなしで宣言されたオブジェクト、または関数パラメーターとして宣言されたオブジェクトには、デフォルトで自動ストレージ期間があります。[注:したがって、自動指定子はほとんどの場合冗長であり、あまり使用されません。autoの使用法の1つは、宣言ステートメントと式ステートメント(6.8)を明示的に区別することです。—エンドノート]

これは、次のシナリオを参照します。これは、toのキャスト、aまたはの前後に冗長な括弧があるタイプintの変数の宣言のいずれかです。これは常に宣言であると見なされるため、ここでは有用なものは何も追加しませんが、代わりに人間にとっては追加します。しかし、繰り返しになりますが、人間は周りの冗長な括弧を削除する方が良いでしょう、私は言うでしょう:aintaautoa

int(a);

C ++ 0xで到着するという新しい意味でauto、コードでC++03の意味でそれを使用することはお勧めしません。

于 2009-06-25T22:13:50.223 に答える
35

autoキーワードには、現時点では目的がありません。ローカル変数のデフォルトのストレージクラスを再記述しているだけで、本当に便利な代替手段はstaticです。

これは、C++0xではまったく新しい意味を持っています。それはあなたにそれがどれほど役に立たなかったかについてのいくらかの考えをあなたに与えます!

于 2009-06-25T22:06:45.263 に答える
7

GCCには、autoネストされた関数のための特別な用途があります-ここを参照してください。

定義の前に呼び出したい入れ子関数がある場合は、で宣言する必要がありますauto

于 2009-06-26T07:34:29.420 に答える
3

「auto」は、コンパイラに変数(メモリまたはレジスタ)を配置する場所を自分で決定するように指示していると思われます。その類似物は「レジスター」であり、これはおそらくコンパイラーにそれをレジスターに保持しようとするように指示します。最近のコンパイラは両方を無視するので、あなたもそうすべきです。

于 2009-06-25T23:07:40.787 に答える
3

このキーワードを使用して、スタックベースのプロセッサの場合、関数にとって重要である場合、変数をスタックに配置することが重要である場合を明示的に文書化します。この関数は、関数(または割り込みサービスルーチン)から戻る前にスタックを変更するときに必要になる場合があります。この場合、私は次のように宣言します。

auto unsigned int auiStack[1];   //variable must be on stack

そして、変数の外部にアクセスします。

#define OFFSET_TO_RETURN_ADDRESS 8     //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;

したがって、autoキーワードは意図を文書化するのに役立ちます。

于 2012-06-14T21:31:56.497 に答える
2

Stroustrupによると、「The C Programming Language」(第4版、C 11をカバー)では、「auto」の使用には次の主な理由があります(セクション2.2.2)(Stroustrupの単語が引用されています)。

1)

定義は、コードの読者にタイプを明確に表示したいという広い範囲にあります。

'auto'とそれに必要な初期化子を使用すると、変数の型を一目で知ることができます。

2)

変数の範囲または精度について明示的にしたい(たとえば、floatではなくdouble)

私の意見では、ここに当てはまるケースは次のようなものです。

   double square(double d)
    {
        return d*d; 
    }

    int square(int d)
    {
        return d*d; 
    }

    auto a1 = square(3);

    cout << a1 << endl;

    a1 = square(3.3);

    cout << a1 << endl;

3)

'auto'を使用すると、冗長性や長い型名の記述を回避できます。

テンプレート化されたイテレータからの長い型の名前を想像してみてください。

(セクション6.3.6.1のコード)

template<class T> void f1(vector<T>& arg) {
    for (typename vector<T>::iterator p = arg.begin(); p != arg.end();   p)
        *p = 7;

    for (auto p = arg.begin(); p != arg.end();   p)
        *p = 7;
}
于 2013-06-06T00:23:50.123 に答える
1

古いコンパイラでは、autoはローカル変数を宣言する1つの方法でした。Turbo Cなどの古いコンパイラでは、autoキーワードなどがないとローカル変数を宣言できません。

于 2010-06-07T20:31:01.347 に答える
1

C ++ 0xでのautoキーワードの新しい意味は、MicrosoftのStephan T. Lavavejによって、MSDNのChannel9サイトにあるSTLに関する無料で表示/ダウンロード可能なビデオ講義で非常にうまく説明されています

講義全体を見る価値はありますが、autoキーワードの部分は29分くらい(おおよそ)です。

于 2010-11-19T18:22:14.760 に答える
1

「ローカル変数」以外に「自動」に他の意味はありますか?

C++03にはありません。

あなたがそれを使いたいと思うかもしれないところはどこでもあなたのために暗黙のうちに行われていないことは何ですか?

C ++ 03では、何もありません。

自動変数はプログラムスコープでどのように動作しますか?ファイルスコープの静的自動変数はどうですか?

関数/メソッド本体の外部でキーワードを使用することはできません。

このキーワードは、完全を期すために存在するだけでなく、[C ++ 03で]何か目的がありますか?

驚くべきことに、はい。C ++の設計基準には、Cとの高度な下位互換性が含まれていました。Cにはこのキーワードがあり、C ++でそれを禁止したり、その意味を再定義したりする本当の理由はありませんでした。したがって、目的はCとの非互換性を1つ減らすことでした。

このキーワードは、完全を期すためだけに存在する以外に、Cで何か目的がありますか?

私は最近1つだけ学びました:Bからの古代プログラムの移植の容易さ。Cは構文がCの構文と非常に似ているBと呼ばれる言語から進化しました。しかし、Bにはタイプがまったくありませんでした。Bで変数を宣言する唯一の方法は、そのストレージタイプ(autoまたはextern)を指定することでした。このような:

自動i;

この構文はCでも機能し、同等です。

int i;

Cでは、ストレージクラスのデフォルトは。autoであり、タイプのデフォルトはint。です。Bで始まり、Cに移植されたすべてのプログラムは、当時、文字通りauto変数でいっぱいだったと思います。

C ++ 03では、Cスタイルの暗黙的なintは使用できなくなりましたが、auto暗黙的なintとは異なり、Cの構文に問題が発生することが知られていないため、no-longer-exactly-usefulキーワードは保持されました。

于 2015-09-30T16:45:37.473 に答える