main 함수의 리턴형은 ISO/ANSI C++ 표준에서 int로 정하고 있다. 리턴값은 프로그램이 아무런 에러 없이 종료되는 경우에는 0을 리턴하도록 되어 있고, 에러가 발생해서 종료한 경우에는 0 이외의 값을 리턴하도록 되어있다. 이 값은 OS로 돌려지는 값이기는 하지만 OS에서 이것에 따라 특별히 처리하는 것은 없기 때문에 일반적인 경우에는 이 값은 아무런 의미가 없다. 이 값을 이용할수 있는 방법으로는 exec... 함수를 이용하여 프로그램을 실행해주고 받아오는 방법 등이 있다.
C++의 모든 문장(statement)은 계산 가능한 식이다. 컴파일러에서 에러를 찾을때도 계산 가능한 식인지 확인하여 문장이 올바른 문장인지 에러는 없는지 확인하게 된다. 예를 들어 다음과 같은 두 문장이 있다고 하자.
~cpp
100;
1 + 3;
이런 문장이 들어있는 C++ 프로그램을 컴파일 해 보면 에러가 날 것 같지만 에러가 나지 않는다. 왜냐하면 둘 다 모두 계산 가능한 식이기 때문이다. 계산 가능한 식이라면 최종 결과가 존재해야 한다. 첫번째 문장은 계산이 끝나있는 식이고 최종 결과가 100 이다. 두번째 문장은 한번만 계산하면 계산이 끝나고 최종 결과는 4 이다. 그렇다면 다음과 같은 문장은 계산 가능한 식이 맞는가?
~cpp
a = 10;
std::cout << "Hello World!!";
첫번째 문장을 계산하면 a라는 변수에 10을 대입하면 되고 결국 남는것은 a밖에 없으므로 a의 값이 최종 결과가 된다. 두번째 문장을 계산하면 std::cout과 "Hello World!!"를 왼쪽 쉬프트 연산을 하고 나온 결과가 최종 결과가 된다. 실재로 연산 결과가 std::cout 이고 이것이 최종 결과가 된다. 여기서 왼쪽 쉬프트 연산이 과연 std::cout과 "Hello World!!" 사이에서 가능한 것인가 라는 의문을 갖게 될수도 있겠지만 C++에는 연산자 재정의(operator overloading) 라는 것이 있기 때문에 이런것을 충분히 가능하게 만들수 있다고만 알고 넘어가기 바란다. 여기서 두번째 문장을 자세히 알고 넘어갈 필요가 있다. 두번째 문장도 앞에서 설명했듯이 계산 가능한 식이고, 결국 실행되면 계산이 수행되지만 그것과 더불어 일어나는 일이 한가지 더 있는데, 바로 표준 출력으로 "Hello World!!" 가 출력된다는 것이다. 이렇게 계산되어지는 과정에서 계산 결과와 더불어 나타나는 것을 side effect라고 한다. 첫번째 문장과 같은 경우에는 side effect가 없다. 다음과 같은 두 문장이 있다고 하자.
~cpp
a = b + c;
std::cout << "Hi! C++";
여기서 첫번째 문장은 b라는 변수의 값과 c라는 변수의 값을 더해서 a라는 변수에 저장하는 식으로 최종 결과가 a라는 변수에 저장되므로 이러한 문장은 최종 결과만을 이용하기 위한 문장이고, 두번째 문장은 std::cout과 "Hi! C++"을 왼쪽 쉬프트 연산을 하여 side effect로 "Hi! C++"을 표준 출력에 출력하고 최종 결과는 특별히 따로 저장하지 않으므로 최종 결과에는 관심이 없고, side effect만을 이용하기 위한 문장이다. 물론 예를 들지는 않았지만 최종 결과도 이용하고 side effect도 이용하기 위한 문장도 있다.