Pytanie Jaka jest różnica między "\ n" lub "\ n" w C ++?


Widziałem nową linię \n użyłem 2 różnych sposobów w kilku przykładach kodu, na które patrzyłem. Pierwsza istota '\n' i druga istota "\n". Jaka jest różnica i dlaczego warto jej użyć '\n'?

Rozumiem '\n' reprezentuje znak i "\n" reprezentuje ciąg znaków, ale czy to ma znaczenie?


9
2017-10-26 18:42


pochodzenie




Odpowiedzi:


'\n'jest stałą znaku.

"\n" jest wskaźnikiem do tablicy znaków równoważnej {'\n', '\0'} (\n plus null terminator)

EDYTOWAĆ

Zdaję sobie sprawę, że wyjaśniłem różnicę, ale nie odpowiedziałem na pytanie.

To, którego używasz, zależy od kontekstu. Używasz '\n' jeśli wywołujesz funkcję, która oczekuje postaci, i "\n", jeśli oczekuje ciąg znaków.


25
2017-10-26 18:44





'\n' jest literałem karnym. "\n" jest literałem łańcuchowym (w zasadzie tablica znaków).

Różnica nie ma znaczenia, jeśli piszesz je do zwykłego strumienia. std::cout << "\n"; ma taki sam skutek jak std::cout << '\n';.

W niemal każdym innym kontekście różnica ma znaczenie. Znak char nie jest na ogół wymienny z tablicą znaków lub ciągiem znaków.

Na przykład std::string ma konstruktora, który pobiera const char*, ale nie ma konstruktora, który pobiera char. Możesz pisać std::string("\n");, ale std::string('\n'); nie kompiluje się.

std::string również ma konstruktora, który pobiera char i liczbę razy, aby go powielić. Nie ma takiego, który bierze const char* i liczbę razy, aby go powielić. Więc możesz pisać std::string(5,'\n') i uzyskaj ciąg składający się z 5 znaków nowego wiersza z rzędu. Nie możesz pisać std::string(5, "\n");.

Każda funkcja lub operacja, której używasz, określi, czy jest ona zdefiniowana dla znaku, dla łańcucha w stylu C, zarówno dla przeciążenia, jak i dla żadnego z nich.


8
2017-10-26 18:50



literówka! Zapomniałem ukośnika w drugim przypadku: std::cout << '\n';. - leoger
@leo grrr: dziękuję, ale bój się do tego :-) - Steve Jessop


'\n' jest char stały.

"\n" jest const char[2].

Więc użycie jest mniej więcej takie:

char newLine = '\n';
const char* charPointerStringNewLine = "\n"; // implicit conversion
const char charStringNewLine[2] = "\n";

string stringNewLine( "\n" );

Krótko mówiąc: jeden jest wskaźnikiem do tablicy znaków, drugi jest pojedynczym znakiem.


2
2017-10-26 18:47



"\n" jest const char[2]nie a const char*. Ten pierwszy jest jednak w domyśle wymienialny na drugie. - GManNickG
@GMan: naprawiono. Dzięki - rubenvb


Pojedyncze cudzysłowy oznaczają znak, a podwójne cudzysłów oznaczają ciąg znaków. W zależności od kontekstu możesz wybrać typ danych, z którymi chcesz pracować.


1
2017-10-26 18:45





Rozumiem, że \ n reprezentuje znak, a "/ n" reprezentuje ciąg znaków, ale czy to ma znaczenie?

Jeśli to zrozumiesz, to powinno być jasne, że to naprawdę ma znaczenie. Przeciążone funkcje w bibliotece standardowej C ++ często ukrywają ten fakt, więc może przykład z C będzie bardziej przydatny: putchar przyjmuje jedną postać, więc tylko '\n' jest poprawny, natomiast puts i printf weź ciąg znaków, w tym przypadku tylko "\n" jest poprawne.


0
2017-10-26 18:53