
코드
#include <iostream> using namespace std; int main(){ int A, B; cin >> A >> B; cout << A*B << endl; return 0; }
백준 채점 현황에 들어가보니 다른 사람들 코드도 확인이 가능하네요.
오늘 처음 발견했는데 제 코드보다 짧은 코드들은
어떻게 작성한 건지 확인해보고 싶어 몇 개 열어봤답니다.
전 아직 C++이 익숙하지가 않아 이런 코드들 보면서 배울 점이 많을 것 같아요.
짧은 코드
#include <iostream> int main () { int a,b; std::cin >> a >> b; std::cout << a * b; }
이 코드는 저와 달리 using namspace std;을 사용하지 않음으로써 코드 길이를 줄였네요. 짧은 코드에서는 이게 더 간단할 수도 있겠어요.
짧은 코드 2
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a * b; }
return 0; 나 cout 끝에 endl은 꼭 안 써줘도 되는 건가? 하는 궁금증이 생겨 조금 찾아봤습니다.
main함수는 어떤 값을 return하더라도 프로그램이 그 시점에서 종료 처리됩니다.
이때, main함수에서 0을 return하면 운영체제한테 프로그램이 정상 종료되었음을 알려주고, 0이 아닌 값을 return하면 운영체제한테 프로그램이 정상 종료되지 않았음을 알려줍니다.
프로그램이 종료 처리되는 건 return값에 따라 달라지진 않는 것이지요.
단 값이 의미 있는 경우는 프로그램 수행 후 프로그램의 return값(종료 코드)에 따른 프로그램의 실행 상태를 알고자 하는 경우입니다.
즉, 프로그램 return값에 따라 이후 연속되는 어떤 처리를 해야 할 경우 return값이 의미가 있고, 그렇지 않은 경우 어떠한 값이 return되더라도 사용하지 않으니 상관없습니다.
일반적으로는 원하는 기능이 잘 처리되어 끝나면 0, 그렇지 않으면 0이 아닌 값(-1)을 return합니다.
좀더 상세히 분리해 처리해야할 경우 return값을 미리 정의해 다양하게 사용할 수도 있습니다. 이 경우 사용자에게 프로그램 종료코드에 따른 실행 상황을 알려줄 수 있고, 이에 따라 처리를 할 수 있습니다.
우선 개행문자 \n와 endl모두 줄바꿈을 해줍니다.
단, 둘의 차이점을 살펴보자면
\n의 역할개행문자 \n로 줄바꿈할 경우 해당 데이터가 버퍼에 남아있는 상태에서 줄바꿈이 됩니다. 우리가 키보드를 누를 때마다 그 문자는 버퍼에 쌓입니다.
endl으로 줄바꿈할 경우 버퍼를 비우고(flush) 다음 줄 가장 앞으로 커서가 이동됩니다. 즉, 줄바꿈과 버퍼를 지우는 일 2가지를 동시에 실행합니다.
Backspace로 수정할 때 가장 위에 쌓였던 버퍼는 지워지고, 문장이 최종 완성되면 enter를 누름과 동시에 쌓여있던 문자가 한번에 전송됩니다. 버퍼에 임시 저장되어 남아있는 데이터는 끝을 의미하는 것(ex.개행문자)을 만나면 한 번에 전송합니다.
메모리의 임시 저장 공간인 버퍼를 사용하면 아래와 같은 3가지 장점이 있습니다.
1. 문자를 한 번에 전달해 전송시간이 적게 걸림
2. 문자를 잘못 입력했을 때 수정 가능
3. 시스템콜을 적게 호출해 자원을 아낌
flush란 버퍼를 비운다는 것으로, 버퍼에 저장되어 있던 내용을 내보낸다는 것입니다.
따라서 매번 줄바꾸는 동시에 버퍼를 비우는 endl을 사용할 경우 \n을 사용할 때보다 런타임 시간이 오래 걸릴 수 있습니다.