"인간은 망각의 동물이다"
"사용한 지식만이 기억에 남는다"
코딩 문제를 풀다 굉장히 흥미로운 것을 발견하였다.
#include <iostream>
int main()
{
int n = 100;
int m = 1;
std::cout << n > m ? 123 : 456;
}
우리는 모두 똑똑하기 때문에 당연히 삼항연산자 정도는 간단하게 할 수 있다.(?)
그런데 코드를 컴파일하면 놀라운 사실을 알 수 있다. 그다지 놀랍진 않다 어짜피 똑똑한 Visual Studio가 오류를 알려준다. 바로 오류가 난다는 것이다. 그런데 비교 연산자에 괄호를 씌우면 문제는 없을 거다.
그런데 문제는 지금 부터다 코드를 보자
#include <iostream>
int main()
{
int n = 100;
int m = 1;
std::cout << (n > m) ? 123 : 456;
}
맞다. 전혀 문제가 없어 보인다(?). 문제가 있다 하면서 없음? 놀리는 거임?
진정하고 잘 봐보자. 솔직히 잘 봐도 모르겠다 우리는 분명 괄호를 씌어 비교 연산을 먼저 해 오류를 해결했다. 그런데 아마 이 코드를 실행해 보면 결과값이 이상할 것이다.
#include <iostream>
int main()
{
int n = 100;
int m = 1;
std::cout << (n > m) ? 123 : 456;
}
output : 1
자 뭔가 이상하다. 분명히 n이 m보다 크니까 True 그러면 123이 나와야 우리가 아는 삼항 연산자 아닌가?
하지만 답은 연산자 우선순위의 있다.
밑에 표를 보자


출처 : https://computer-science-student.tistory.com/156
std::cout << 이 코드를 보면 << 이 연산자는 입출력 연산자로 사용하고 있지만 사실상 비트 연산자이다. 왜냐하면 입출력 연산자는 연산자 오버로딩으로 만든 연산자이기 때문이다. 그러면 조건 연산인 삼항 연산자는 연산순서가 굉장히 낮다 그렇기 때문에 이 코드에서 1이 출력 된 것이다.
#include <iostream>
int main()
{
int n = 100;
int m = 1;
std::cout << (n > m) ? 123 : 456;
}
output : 1
그러면 해결 방법으로 삼항연산을 더 빠르게 하기 위해 삼항 연산 전체에 괄호를 씌우는 방법이 있다. 이제 제대로 동작할 것 이다.
#include <iostream>
int main()
{
int n = 100;
int m = 1;
std::cout << (n > m ? 123 : 456);
}
output : 123
마지막으로 말을 마치며 C#의 경우 아래 코드와 같이 C#에서의 입출력은 함수의 형태를 띈다.
namespace Magic
{
public class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
하지만 C++의 경우는 std::cout << 형태로 함수 형태가 아닌 연산자를 사용하고 있다. 이런게 가능한 이유는 cout이 함수가 아닌 객체로 이루어져 있긴 때문인데
이 내용은 다음 시간에 다루도록 하자