Czytam Accelerated C ++ autorstwa Koeniga. Pisze, że „nowy pomysł polega na tym, że możemy użyć + do połączenia łańcucha i literału ciągu - lub, w tym przypadku, dwóch łańcuchów (ale nie dwóch literałów łańcuchowych).
W porządku, to chyba ma sens. Teraz przejdźmy do dwóch oddzielnych ćwiczeń, które mają to wyjaśnić.
Czy poniższe definicje są prawidłowe?
const string hello = "Hello";
const string message = hello + ",world" + "!";
Teraz próbowałem wykonać powyższe i zadziałało! Więc byłem szczęśliwy.
Potem spróbowałem wykonać następne ćwiczenie;
const string exclam = "!";
const string message = "Hello" + ",world" + exclam;
To nie zadziałało. Teraz rozumiem, że ma to coś wspólnego z faktem, że nie można łączyć dwóch literałów ciągów, ale nie rozumiem semantycznej różnicy między tym, dlaczego udało mi się uruchomić pierwszy przykład (to nie jest „, world” i „! „dwa literały łańcuchowe? Czy to nie powinno działać?), ale nie drugi.
"Hello" + ", world!"
kiedy możesz "Hello, world!"
. Jak zwykle C ++ ma niesamowite i proste obejście zauważonego problemu. :-)
"Hello" ", world!"
(bez +
). Jest wiele skarg, które można by złożyć na temat C ++, ale nie sądzę, aby rozpatrywanie tutaj było jedną z nich. To dokładnie to samo, co gdybyś pisał 1 / 3 + 1.5
i narzekał, ponieważ podział był całkowy. Na dobre lub na złe, tak działa większość języków.
"hello" " world" == "hello world"
jest przydatna, jeśli musisz napisać długi ciąg i nie chcesz, aby wyszedł z twojego okna lub chcesz znaleźć się w ograniczeniu długości linii. Lub jeśli jeden z ciągów jest zdefiniowany w makrze.
const string message = "Hello" ",world" + exclam
(np. pominięcie pierwszego+
) powinno działać dobrze.