私は少し混乱しています。これらのコードの論理的な違いは何ですか?
#include <iostream>
using namespace std;
int main(){
char a[5]="ABCD"; // this
cout << a;
return 0;
}
2番目は
char a[5]={"ABCD"}; // this
3つ目は
char a[5]={'A','B','C','D'}; // this
私は少し混乱しています。これらのコードの論理的な違いは何ですか?
#include <iostream>
using namespace std;
int main(){
char a[5]="ABCD"; // this
cout << a;
return 0;
}
2番目は
char a[5]={"ABCD"}; // this
3つ目は
char a[5]={'A','B','C','D'}; // this
char a[5]={"ABCD"};
char a[5]={'A','B','C','D','\0'};
どちらの場合も、文字の配列aは char 型の 5 つの要素のサイズで宣言されます。単語"ABCD"を構成する 4 文字と、末尾を指定する最後のヌル文字('\0')を加えたものです。 2 番目のケースでは、二重引用符 (") を使用すると、自動的に追加されます。コンマで区切られたヌル文字を追加することに注意してください。二重引用符 ("") で囲まれた一連の文字は、文字列定数と呼ばれます。C コンパイラ'\0'
文字列定数の末尾にヌル文字を自動的に追加して、文字列の末尾を示すことができます。
出典:このリンクはあなたをより良くするのに役立ちます
最初の 2 つは、構文のみが異なる配列char[5]
へのソースの割り当てです。char[5]
(5 は 4 文字とヌル ターミネータ)
最後のものも同じことを行いますが、null ターミネータを明示的に指定していません。に割り当てているためchar[5]
、最後のものは残りのスペースをゼロで埋め、null ターミネータを効果的に追加して同じように動作しますが、最後のものはchar[4]
;に割り当ててもコンパイラエラーをスローしません。終了していない文字の配列が残るだけです。