IT story

"\ n"또는 '\ n'또는 std :: endl에서 std :: cout으로?

hot-time 2020. 9. 3. 23:43
반응형

"\ n"또는 '\ n'또는 std :: endl에서 std :: cout으로? [복제]


이 질문에 이미 답변이 있습니다.

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

반응형