質問: ``` #include #include using namespace std; int main(int argc, char** argv){ cout< > 2 > > Enterキーを押すと、ターミナルが終了します... > > > この書き方でなぜエラーが出ないのか全く理解ができません エラーが出ないからには何かしらの理解の仕方があると思うのですがさっぱりです。 これは、コンパイラから見てどう解釈されているのですか
回答: 既に回答がついていますが、簡潔すぎるのではないかと思い補足的に書きます。 (1)`"123"`は、既に書いた時点で`char[]`のリテラルです。 ``` cout << strlen(&"123"[1]) << endl; ``` は、次と同様です。 ``` char[] str = "123"; cout << strlen(&str[1]) << endl; ``` 実際のリテラルの中身は、次のようになってます。 ``` str[0] : '1' str[1] : '2' str[2] : '3' str[3] : '\0'(null) ``` (2)`"123"[1]`は、`"123"`という`char[]`リテラルの第2要素を指しています。つまり`str[1]`です。 つまり、`"123"[1]`そのものは、`str[1]`と同じなので、2文字目にある`'2'`です。 (3)`&"123"[1]`は、`&(str[1])`と同じで、`"123"`という`char[]`リテラルの第2要素のポインタ(通常は`'2'`のあるアドレス)を指しています。 (4)`strlen(&"123"[1])`は、`"123"`という`char[]`リテラルの第2要素から数えて、`'\0'`(null)が出てくるまでのcharの数なので、2(`str[1]`,`str[2]`で2つ)となります。