はじめに
AtCoderで問題を解いている時に、C++におけるシングルクォーテーション(‘)とダブルクォーテション(“)の違いについて、理解しておらず、ハマったのでまとめておきます。
事の発端
int main() {
string s;
cin >> s;
if(s[i] == "0"){
ans += "0";
}
}
上記のコードを書いたところエラーになりました。何故かというと、ifの条件のところを“0”としているからです。正解は‘0’としなくてはいけません。
シングルクォーテーションとダブルクォーテーションで何が違うのでしょうか。
答えは文字か文字列かという事です。
シングルクォーテーションとダブルクォーテションの違い
C++では、シングルクォーテーションで囲えるのは1文字だけなので、自然に文字となります。ダブルクォーテションで囲った時は例え1文字だけだったとしても文字列となります。
C++は、文字と文字列を別物と判別します。なので、中身の文字が一緒でも‘0’と“0”はC++では別物となります。試しに、下記のコードを実行して型を調べてみます。
すると、‘0’と“0”の型が違うものが出力されています。cはchar型という意味です。‘0’とs[0]はchar型ですが、“0”はA2_cとなって、型が違うことがわかります。
A2_cはどういう意味かというと、Aは文字列でchar形式の時は “A長さ_c”という形で表されます。つまり、A2_cは長さ2の文字列という意味です。1文字なのに、長さが2となるのは、文字列の場合には1番最後に’0’が付くためだそうですが、この辺はよくわかりません。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "Hello";
cout << typeid('0').name() << endl; => c
cout << typeid("0").name() << endl; => A2_c
cout << typeid(s[0]).name() << endl; => c
}
まとめ
- シングルクォーテーションで囲うと文字となり、ダブルクォーテションで囲うと文字列となる。
- C++では文字と文字列は別物として扱われる。