해당 연산자 관련, 궁금해서 이것 저것 시도해보다가 문의 사항이 생겨 질문 드립니다.
삼항 연산자 사용시, 조건식에는 일반적으로 대입의 등호(=) 가 아닌 비교 연산자(==) 를 사용해야 하는것은 이해했으나, 만약 "=" 을 사용할 경우 어떻게 결과가 나오는지 궁금하여 다음과 같이 입력하여 실행했을 때, 다음과 같은 값을 출력 받을 수 있었습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1 , num2;
scanf("%d", &num1);
num2 = num1 = 5 ? ++num1 : --num1;
printf("%d %d\n", num1 ,num2);
return 0;
}
1 (입력)
2 2 (출력값)
제 예상으로는 조건식 때문에 결과값은 입력값에 관계없이 6 6 이 나올 것이라 생각 했는데... 그리고 입력을 0 을 넣어도 동일하게 참일 때의 결과값 1 1 으로 출력 됩니다.
위 결과를 봤을 때, 조건 식의 부분은 해당 조건의 참/거짓을 판단할 때만 사용되고 전체 프로그램의 변수 값에는 영향을 주지 않는다고 판단됩니다. 이부분이 맞는지 아니면, 혹시 제가 잘못한 부분이 있는지 알고 싶습니다.
조언 주시면 감사하겠습니다.
온라인에서 단계별로 실행해볼 수 있습니다.
단계별로 실행해보면
입력이 없으니 num1에 1을 직접 대입하고 실행했습니다.
이제 num2를 정해야 합니다.
실행한 다음의 결과는 2, 2가 됩니다.
불행히도 이 결과는 정답이 아닙니다.
num1 = 5는 num1을 변경하는 것이고, ++num1과 --num1도 num1을 변경하는 것입니다. 한 문장에서 num1을 변경하는 것이 두 번씩 쓰일 수 없습니다. 이는 시퀀스 포인트 위배이고, 이에 대한 컴파일러의 동작은 정의되어 있지 않습니다. 따라서 문의한 것처럼 결과가 6 6이 나오는 컴파일러도 있을 수 있습니다.
올바른 코드가 아니므로 이와 같은 코드는 작성하지 않는 것이 원칙입니다.
또한, 협업을 위해 코드를 작성하기 때문에 알아보기도 어렵고, 의미 파악도 어려운 코드는 작성하지 않는 것이 좋습니다.(좋은 회사라면 코드 리뷰 시간에 이렇게 작성하지 말라는 리뷰를 받을 수 있을 것입니다. 물론, 리뷰를 받고도 고치지 않고 고집스럽게 코드를 엉망으로 작성한다면 책상이 사라지겠지요?)
올바른 코드를 작성하세요. 읽기 쉬운 코드를 작성하세요.
코딩은 글쓰기와 같습니다. 한글은 배웠지만, 독자가 쉽게 읽을 수 있는 글을 쓰는 것은 많은 훈련이 필요합니다. 올바른 코딩을 하세요.