많은 C ++ 서적에는 다음과 같은 예제 코드가 포함되어 있습니다.
std::cout << "Test line" << std::endl;
... 그래서 항상 그렇게했습니다. 그러나 대신 다음과 같이 일하는 개발자의 많은 코드를 보았습니다.
std::cout << "Test line\n";
다른 것을 선호하는 기술적 이유가 있습니까, 아니면 코딩 스타일의 문제입니까?
'\n'
있습니다.
많은 C ++ 서적에는 다음과 같은 예제 코드가 포함되어 있습니다.
std::cout << "Test line" << std::endl;
... 그래서 항상 그렇게했습니다. 그러나 대신 다음과 같이 일하는 개발자의 많은 코드를 보았습니다.
std::cout << "Test line\n";
다른 것을 선호하는 기술적 이유가 있습니까, 아니면 코딩 스타일의 문제입니까?
'\n'
있습니다.
답변:
파일이 텍스트 모드로 열려 있다고 가정하면 이진을 요구하지 않으면 얻을 수있는 줄 바꿈 문자는 중요하지 않습니다. 컴파일 된 프로그램은 컴파일 된 시스템에 맞는 것을 작성합니다.
유일한 차이점은 std::endl
출력 버퍼 를 플러시하고 '\n'
그렇지 않다는 것입니다. 버퍼를 자주 플러시하지 않으려면을 사용하십시오 '\n'
. 예를 들어 모든 출력을 얻고 프로그램이 불안정한 경우을 사용하십시오 std::endl
.
::std::cerr
않고 ::std::cout
각각의 모든 출력 작업으로 플러시되므로 대신 사용 을 고려하십시오 .
stderr
"오류"에 대한 것이 아닙니다 . 오히려, 대역 외 진단 메시지를위한 것입니다. ./prog > file
실제 프로그램 페이로드 만 말하고 저장할 수 있어야 하지만 프로그램은 정상적인 상호 작용에서도 훨씬 더 많은 상태 정보를 출력 할 수 있습니다.
차이점은 다음과 같이 설명 할 수 있습니다.
std::cout << std::endl;
에 해당
std::cout << '\n' << std::flush;
그래서,
std::endl
출력을 즉시 플러시하려는 경우 사용하십시오 .\n
당신이 (당신이 사용하는 경우 아마도 경우하지 않은 성능에 대해 걱정하는 경우 <<
연산자).나는 \n
대부분의 라인에서 사용 합니다.
그런 다음 std::endl
단락의 끝에 사용 하십시오 (그러나 그것은 습관이며 일반적으로 필요하지는 않습니다).
다른 주장과 반대로, \n
문자 스트림이 파일에가는 (경우에만 라인 시퀀스의 올바른 플랫폼 말에 매핑 std::cin
과 std::cout
) 같은 파일 특별하지만 여전히 파일 (또는 인).
cout
에 연결되어 cin
사용자가 입력을 읽으면에서 의미 cin
, cout
먼저 플러시됩니다. 그러나에서 읽지 않고 진행률 표시 줄이나 무언가를 표시하려면 cin
플러시가 유용합니다.
operator<<
성능이 좋지 않거나 성능에 어떤 대안을 사용할지 몰랐 습니까? 이것을 더 이해하기 위해 몇 가지 자료를 알려주세요.
sync_with_stdio(false)
과 동기화 해제 하고 출력을 지속적으로 플러시하지 마십시오. 도서관이 언제해야하는지 알아 내십시오. stackoverflow.com/a/1926432/14065
성능 문제가있을 수 있으며 std::endl
출력 스트림을 강제로 플러시합니다.
사용하려는 경우 다른 함수 호출이 암시됩니다. std::endl
a) std::cout << "Hello\n";
b) std::cout << "Hello" << std::endl;
a) 연산자를 <<
한 번 호출합니다 .
b) 연산자를 <<
두 번 호출합니다 .
std::cout << "Hello" << "\n";
?
<<
케이스에 2 것 따라서 나는 하나 또는 두에 대한 필요성 주장하지 않을뿐만 아니라 수 (일반적으로 두 함수 호출을) 차이 와 . <<
\n
endl
나는 표준에서 이것에 대해 읽은 것을 상기 시켰습니다.
C ++ 프로그램이 CRT와 인터페이스 할 때 C11 표준이 플러싱 정책을 제어해야하므로 표준 스트림의 작동 방식을 정의하는 C11 표준을 참조하십시오.
ISO / IEC 9899 : 201x
7.21.3 §7
프로그램 시작시 세 개의 텍스트 스트림이 사전 정의되어 있으며 표준 입력 (일반 입력 읽기), 표준 출력 (일반 출력 쓰기) 및 표준 오류 (진단 출력 쓰기)와 같이 명시 적으로 열 필요가 없습니다. 처음에 열었을 때 표준 오류 스트림은 완전히 버퍼링되지 않습니다. 표준 입력 및 표준 출력 스트림은 스트림이 대화식 장치를 참조하지 않는 것으로 결정될 수있는 경우에만 완전히 버퍼링됩니다.
7.21.3 §3
스트림이 버퍼링되지 않은 경우 가능한 빨리 소스 또는 대상에서 문자가 표시됩니다. 그렇지 않으면 문자가 블록으로 호스트 환경에 쌓이거나 전송 될 수 있습니다. 스트림이 완전히 버퍼링되면 버퍼가 채워질 때 문자가 호스트 환경과 블록으로 전송되도록 문자가 의도됩니다. 스트림이 라인 버퍼링 될 때, 문자는 개행 문자가 발생할 때 블록으로 호스트 환경에서 또는 호스트 환경으로 전송됩니다. 또한 문자는 버퍼가 채워질 때, 버퍼되지 않은 스트림에서 입력이 요청 될 때 또는 호스트 환경에서 문자를 전송해야하는 라인 버퍼링 된 스트림에서 입력이 요청 될 때 호스트 환경에 블록으로 전송됩니다. .
이 수단 std::cout
과 std::cin
완전히 버퍼링 경우에만 그들은 비 대화 형 장치를 참조한다. 즉, stdout이 터미널에 연결되어 있으면 동작에 차이가 없습니다.
그러나을 std::cout.sync_with_stdio(false)
호출 '\n'
하면 대화 형 장치로도 플러시되지 않습니다. 그렇지 않으면 '\n'
해당되는 std::endl
파일에 배관하지 않는 한 : C ++ 심판에 대한 표준 : ENDL .
큰 문제는 아니지만 endl은 boost :: lambda 에서 작동하지 않습니다 .
(cout<<_1<<endl)(3); //error
(cout<<_1<<"\n")(3); //OK , prints 3
Qt 및를 사용 endl
하면 실수로 잘못된 endl
것을 사용하여 매우 놀라운 결과를 얻을 수 있습니다. 다음 코드 스 니펫을 참조하십시오.
#include <iostream>
#include <QtCore/QtCore>
#include <QtGui/QtGui>
// notice that there is no "using namespace std;"
int main(int argc, char** argv)
{
QApplication qapp(argc,argv);
QMainWindow mw;
mw.show();
std::cout << "Finished Execution!" << endl;
// This prints something similar to: "Finished Execution!67006AB4"
return qapp.exec();
}
내가 (올바른 것 endl
대신 std::endl
) 썼고 qtextstream.h (QtCore의 일부)에 endl
정의 된 함수 가있는 것 같습니다 .
잠재적 인 네임 스페이스 문제 "\n"
를 endl
완전히 회피하는 대신에를 사용하면 됩니다 . Qt가 기본적으로하는 것처럼 전역 네임 스페이스에 기호를 넣는 것이 좋지 않은 이유도 좋은 예입니다.
using namespace std;
? :-)
using namespace std;
. 나쁜 습관으로 간주됩니다. “네임 스페이스 std를 사용하는 이유”를
함께 참조 이것은 인 출력 전용 I / O 매니퓰레이터 .
std::endl
삽입물 출력 시퀀스 OS로 개행 문자 것처럼 호출하여 플러시 os.put(os.widen('\n'))
하였다 os.flush()
.
사용시기 :
이 조작기는 즉시 출력 라인을 생성하는 데 사용될 수 있습니다 .
예 :
장기 실행 프로세스의 출력을 표시 할 때 여러 스레드의 활동을 기록하거나 예기치 않게 충돌 할 수있는 프로그램의 활동을 기록합니다.
또한
생성 된 프로세스가 화면 I / O를 수행하는 경우 std :: system을 호출하기 전에 std :: cout의 명시 적 플러시도 필요합니다. 대부분의 다른 일반적인 대화식 I / O 시나리오에서 std :: cout과 함께 사용하면 std :: endl은 중복됩니다. std :: cin, std :: cerr 로의 출력 또는 프로그램 종료는 std :: cout을 호출하기 때문입니다. .플러시(). 일부 소스에서 권장하는 '\ n'대신 std :: endl을 사용하면 출력 성능이 크게 저하 될 수 있습니다.