"\ n"또는 '\ n'또는 std :: endl에서 std :: cout으로? [복제]
이 질문에 이미 답변이 있습니다.
- C ++ : "std :: endl"vs "\ n" 13 개의 답변
에 std::endl
쓸 때 줄을 끝내기 위해 사용 을 중지 std::cout
하고 "\n"
대신 사용하기 시작한 지 몇 년이 지났습니다 .
하지만 이제는 '\n'
대신 사용 하는 코드 스 니펫을 더 많이보기 시작했고 무엇이 가장 좋은지 궁금해하기 시작했습니다.
하나는 문자열이고 다른 하나는 문자라는 명백한 것 외에도 이것을 사용하면 이점이 있습니다.
std::cout << variable << '\n';
이것에 대해 :
std::cout << variable << "\n";
늦은 추가 :
이 질문을 할 때 개행 '\n'
이 버퍼를 플러시 한다고 생각하는 것 같았습니다 . 이제 나는 그것이 다르다는 것을 압니다 .
기본적으로 std::cin
이전 C stdin
FILE*
스트림에 std::cout
연결되어 있으며 stdout
. 개행 문자의 플러싱은이 묶음에서 비롯됩니다. 기본적 stdout
으로 터미널에 연결된 경우 라인 버퍼링됩니다. 즉, 새 라인이 버퍼를 플러시합니다. 사용하여 줄 바꿈을 인쇄 할 때 그래서 std::cout
, 그것은으로 이어질 것 stdout
플러시된다.
경우 stdout
단말기에 연결되어 있지 않은 (예를 들어, 출력은 재 또는 파이프되어있다), 또는 사이 타이 경우 std::cout
와는 stdout
고장 후 바꿈 플러시 아무것도하지 않을 것이다.
실제로 '\n'
는 기본값이어야합니다. 스트림을 명시 적으로 플러시하고 싶지 않은 경우 (그리고 언제, 왜 그렇게 하시겠습니까?), 전혀 사용할 필요가 없습니다 std::endl
. 1
물론 많은 책과 튜토리얼 std::endl
이 기본값으로 사용 됩니다. 이는 유감스럽게도 심각한 성능 버그로 이어질 수 있습니다 .
나는 사용 '\n'
하거나 사용하는 것 사이에 약간의 차이가 있다고 생각 "\n"
하지만 후자는 (2) 문자의 배열로 문자별로 인쇄해야하며 루프를 설정해야하며 단일 문자를 출력하는 것보다 더 복잡합니다. . 물론, IO를 수행 할 때 이것은 거의 중요하지 않지만 의심스러운 경우 하나의 문자 리터럴을 출력하려면 전체 문자열 리터럴이 아닌 문자 리터럴을 출력하십시오.
이렇게하면 좋은 부작용은 실수로만 한 것이 아니라 단일 문자 만 출력 하도록 의도 한 코드를 코드에서 전달한다는 것 입니다 .
1 개 주 std::cout
에 묶여 std::cin
에 리드가 기본적으로 std::cout
사용자가 입력 뭔가가 전에 메시지가 인쇄됩니다 그래서, 모든 입력 작업을하기 전에 플러시된다.
최고는 없습니다. 필요한 것을 사용합니다.
- '\ n'-줄 끝
- "일부 문자열 \ n"-일부 문자열 뒤의 줄 끝
std::endl
-라인을 끝내고 스트림을 플러시합니다.
그들은 다른 일을합니다. "\n"
개행을 출력하지만 (적절한 플랫폼 별 표현 "\r\n"
으로 Windows에서를 생성 함 ) std::endl
동일한 작업을 수행 하고 스트림을 플러시합니다 . 일반적으로 스트림을 즉시 플러시 할 필요가 없으며 성능 만 저하되므로 대부분의 경우을 사용할 이유가 없습니다 std::endl
.
편집 : 나는 내 대답을 잘못 말했는데, 사람들이 "\ n"이 실제로 null 문자를 인쇄했다고 생각하게 만들었을 수 있습니다. 이것은 물론 잘못되었습니다 :)
편집 2 : C ++ 참조를 살펴본 후 char
어쨌든 s는 참조로 전달되므로 차이가 없습니다. 유일한 차이점은 cstring에서 구분 문자를 검색해야한다는 것입니다. 이 사실 때문에 아래는 정확하지 않습니다.
'\n'
어느 때보 약간 더 효율적인 것 "\n"
, 후자는 또한 당신이를 보내는 의미 끝에 널 문자가 포함되어 있기 때문에, char*
에 operator<<()
A의 단일 바이트에 반대 (32 비트 시스템에서 일반적으로 4 바이트) char
.
실제로 이것은 경계선과 관련이 없습니다. 개인적으로 저는 블라디미르가 설명한 대회를 따릅니다. *
std::cout << variable << std::endl;
std::endl
개행을 출력하지만 출력 스트림도 플러시합니다. 즉,std::cout << variable << '\n'; // output newline std::cout.flush(); // then flush
std::cout << variable << '\n';
'\n'
char,
따라서 출력에 대한 개행ostream& operator<< (ostream& os, char c);
이 사용됩니다.std::cout << variable << "\n";
"\n"
A는const char[2]
그래서,ostream& operator<< (ostream& os, const char* s);
사용됩니다. 우리는이 함수가 루프를 포함 할 것이라고 상상할 수 있습니다. 우리는 개행 문자를 인쇄하는 것이 과도하다고 주장 할 수 있습니다.
std::endl
스트림을 플러시합니다. 이런 일이 발생하고 싶을 때 (예 : 출력이 적시에 사용자에게 표시되기를 기대하기 때문에) 스트림 std::endl
에 쓰는 대신 '\n'
(분리 된 문자 또는 문자열의 일부로) 사용해야 합니다 .
Sometimes, you can get away without explicitly flushing the stream yourself; e.g. in a linux environment, if cout
is synchronized with STDOUT
(this is the default) and is writing to a terminal, then by default, the stream will be line buffered and will automatically flush every time you write a new line.
However, it is risky to rely on this behavior. e.g. in the same linux environment, if you decide to run your program with stdout
being redirected to a file or piped to another process, then by default, the stream will be block buffered instead.
Similarly, if you later decide to turn off synchronization with stdio (e.g. for efficiency), then implementations will tend to use iostream
's buffering mechanisms, which doesn't have a line buffering mode.
I have seen much wasted productivity due to this mistake; if output should be visible when it is written, then you should either use std::endl
explicitly (or use std::flush
or std::ostream::flush
, but I usually find std::endl
more convenient), or do something else that ensures flushing happens often enough, such as configuring stdout
to be line buffered (assuming that's adequate).
참고URL : https://stackoverflow.com/questions/8311058/n-or-n-or-stdendl-to-stdcout
'IT story' 카테고리의 다른 글
"추상 오버"는 무엇을 의미합니까? (0) | 2020.09.03 |
---|---|
MVC 3 파일 업로드 및 모델 바인딩 (0) | 2020.09.03 |
JavaScript 이외의 다른 언어가 중괄호 시작 위치 (같은 줄과 다음 줄)에 차이가 있습니까? (0) | 2020.09.03 |
angularjs에서 이벤트를 트리거 한 요소에 액세스하는 방법은 무엇입니까? (0) | 2020.09.03 |
절대 경로가 필요한 PHP 파일을 포함하는 방법은 무엇입니까? (0) | 2020.09.02 |