19

入力してもエラーは発生しません

char a[10] = "Hi";

しかし、次のように変更すると、エラーが発生します。Array type char is not assignable.

char a[10];
a = "Hi";

配列型charが割り当てられないのはなぜですか?言語が意図的にそのように書かれているからですか、それとも私はポイントを逃していますか?

4

7 に答える 7

25

配列は変更可能な左辺値ではありません

使用する

char a[10];
strcpy(a, "Hi");
于 2013-02-16T22:47:11.450 に答える
15

上でコメントしたように、これを行うC ++の方法は、のstd::string代わりにを使用することですchar[]。これにより、期待する割り当て動作が得られます。

とはいえ、2番目のケースでのみエラーが発生する理由は=、これら2行のが異なる意味を持つためです。

char a[10] = "Hi";
a = "Hi";

1つ目は初期化で、2つ目は割り当てです。

最初の行は、スタックに10文字を保持するのに十分なスペースを割り当て、それらの文字の最初の3つを「H」、「i」、および「\0」に初期化します。この時点からa、スタック上のアレイの位置を参照するだけです。配列はスタック上の単なる場所であるため、a変更することはできません。スタック上の別の場所に別の値を保持する場合は、別の変数が必要です。

一方、2番目の(無効な)行は、aの(技術的に異なる)呪文を参照するように変更しようとし"Hi"ます。上記の理由により、これは許可されていません。初期化された配列を取得したら、それを使用して実行できるのは、配列から値を読み取り、配列に値を書き込むことだけです。その場所やサイズを変更することはできません。この場合、割り当てはそれを実行しようとします。

于 2013-02-16T23:15:17.907 に答える
12

この言語では、文字配列に文字列リテラルを割り当てることはできません。strcpy()代わりに次を使用する必要があります。

strcpy(a, "Hi");
于 2013-02-16T22:46:55.600 に答える
2

a は、配列自体ではなく、配列へのポインターです。再割り当てすることはできません。

あなたは C++ BTW でタグ付けしました。その場合は、std::string を使用することをお勧めします。それはおそらくあなたが期待しているもの以上です。

于 2013-02-16T22:46:30.097 に答える
1

シンプルに、

char a[10] = "Hi";

実行時にそのように行うことはできないため、少し「追加機能」です。

しかし、それが C/C++ 標準ライブラリの理由です。

#include <string.h>

// ...
strcpy(a,"Test"); // STR-ing C-o-PY.

これは C の標準ライブラリに由来します。C++ を使用している場合は、目的の PC から最大限のパフォーマンスを引き出したい場合を除き、std::string を使用する必要があります。

于 2013-02-16T22:48:08.143 に答える
0

これは、初期化が割り当てではないためです。最初に動作するのは初期化であり、動作しない 2 番目の動作は期待どおり代入です。strcpyまたはのように sth を使用する必要がある配列に値を割り当てることはできませんmemcpystd::copyまたは、代わりにから使用することもできます<algorithm>

于 2013-02-16T22:48:26.553 に答える
-2

それはとても単純です、(=)は2つの異なる平均代入と初期化を持っています。そのようなコードを書くこともできます

         #include <iostream>

         using namespace std;

          int main ()
         {
             char message[3] = {'H', 'i', '\0'};

                cout << message<< endl;

           return 0;

           } 

このコードでは、難しいコードや関数を書く必要はなく、string.hも必要ありません。

于 2013-02-17T08:23:35.527 に答える