プログラミング歴2年のPHPerがプログラミング力を上げるためにC++を勉強中です。 C++の勉強のために色々試してみて、その記録を残していきます。 今回は、変数の初期化について。
コンパイラ
$ clang++ --version Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.7.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
実行コマンド
$ clang++ {filename} -o temp && ./temp
<追記> 文字列は配列で作られるってことを忘れて、以下の記事を書いていた。。。 char型は無視してください。
整数0を入れる
コード
#include<iostream>
using namespace std;
int main() {
int a;
float b;
double c;
short d;
long e;
char f;
bool g;
a = 0;
b = 0;
c = 0;
d = 0;
e = 0;
f = 0;
g = 0;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
return 0;
}
出力
a: 0 b: 0 c: 0 d: 0 e: 0 f: g: 0
考察
- 文字列型だけ出力されない
- コンパイルエラーでない
整数1を入れてみる
コード
#include<iostream>
using namespace std;
int main() {
int a;
float b;
double c;
short d;
long e;
char f;
bool g;
a = 1;
b = 1;
c = 1;
d = 1;
e = 1;
f = 1;
g = 1;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
return 0;
}
出力
a: 1 b: 1 c: 1 d: 1 e: 1 f: g: 1
考察
- 文字列型だけ、出力されていない
- コンパイルエラーも起きない
2を入れてみる
コード
#include<iostream>
using namespace std;
int main() {
int a;
float b;
double c;
short d;
long e;
char f;
bool g;
a = 2;
b = 2;
c = 2;
d = 2;
e = 2;
f = 2;
g = 2;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
return 0;
}
出力
a: 2 b: 2 c: 2 d: 2 e: 2 f: g: 1
考察
- bool型は1(true)になる
-1を入れてみる
コード
省略
出力
a: -1 b: -1 c: -1 d: -1 e: -1 f: g: 1
考察
- マイナスの値でもboolはtrue(当たり前)
小数1.1を入れてみる
コード
#include<iostream>
using namespace std;
int main() {
int a;
float b;
double c;
short d;
long e;
char f;
bool g;
a = 1.1;
b = 1.1;
c = 1.1;
d = 1.1;
e = 1.1;
f = 1.1;
g = 1.1;
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
return 0;
}
出力
エラー
init.cpp:14:9: warning: implicit conversion from 'double' to 'int' changes value from 1.1 to 1 [-Wliteral-conversion]
a = 1.1;
~ ^~~
init.cpp:17:9: warning: implicit conversion from 'double' to 'short' changes value from 1.1 to 1 [-Wliteral-conversion]
d = 1.1;
~ ^~~
init.cpp:18:9: warning: implicit conversion from 'double' to 'long' changes value from 1.1 to 1 [-Wliteral-conversion]
e = 1.1;
~ ^~~
init.cpp:19:9: warning: implicit conversion from 'double' to 'char' changes value from 1.1 to 1 [-Wliteral-conversion]
f = 1.1;
~ ^~~
init.cpp:20:9: warning: implicit conversion from 'double' to 'bool' changes value from 1.1 to true [-Wliteral-conversion]
g = 1.1;
~ ^~~
5 warnings generated.
出力
a: 1 b: 1.1 c: 1.1 d: 1 e: 1 f: g: 1
考察
- floatとdouble以外はWarningがでる
- 一応出力までされる
文字列にしてみる
コード
#include<iostream>
using namespace std;
int main() {
int a;
float b;
double c;
short d;
long e;
char f;
bool g;
a = "1.1";
b = "1.1";
c = "1.1";
d = "1.1";
e = "1.1";
f = "1.1";
g = "1.1";
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
cout << "e: " << e << endl;
cout << "f: " << f << endl;
cout << "g: " << g << endl;
return 0;
}
出力
init.cpp:14:9: error: assigning to 'int' from incompatible type 'const char [4]'
a = "1.1";
^~~~~
init.cpp:15:9: error: assigning to 'float' from incompatible type 'const char [4]'
b = "1.1";
^~~~~
init.cpp:16:9: error: assigning to 'double' from incompatible type 'const char [4]'
c = "1.1";
^~~~~
init.cpp:17:9: error: assigning to 'short' from incompatible type 'const char [4]'
d = "1.1";
^~~~~
init.cpp:18:9: error: assigning to 'long' from incompatible type 'const char [4]'
e = "1.1";
^~~~~
init.cpp:19:9: error: assigning to 'char' from incompatible type 'const char [4]'
f = "1.1";
^~~~~
6 errors generated.
考察
- 何かおかしい
- ここで文字列は配列で扱われるから、この初期化じゃまずいと気づく
まとめ
- 整数はだいたいサラッと流れていく。
- 文字列の扱い方が課題