함수 매개변수 평가순서, 피연산자 평가 순서

·2022년 5월 23일

C-Study

목록 보기
10/21

#20220523
chapter.42- 44

  • 함수 매개변수의 평가 순서
    • 표준에 따르면 함수 매개변수의 평가 순서는 명시되어있지 않음
    • 컴파일러에 따라 평가 순서가 달라질 수 있음
    • 이 둘 중 뭐가 먼저 호출될지는 컴파일러 마음!
      • ⭐️ 그렇기 때문에 한줄에 함수 호출 순서에 의존해서 코드를 작성하지 말 것, 두 함수를 두 줄에 '따로' 호출 할 것!
      • add, subtract 둘 중 뭐가 먼저 실행될지는 unspecified
      • 한 줄에서 동일한 변수 여러번 바꾸면 위험하다!
        (ex). num = ++num + num++; (X) )
        ; -> 시퀀스 포인트(;) -> ; 하나 -> 한줄
       int main(void)
       {
       	int num1 = 128;
           int num2 = 256;
           
           printf("%d, %d\n", add(num1, num2), subtract(num1, num2); 
           
           return 0;
       
       }
  • 연산자 우선순위에 따른 평가 순서는?
    순서 전혀 알 수 없다! (; 시퀀스 포인트도 한개임!)
    연산자 우선순위와 평가 순서는 서로 아무 연관이 없음!
int result = add(num1, num2) + subtract(num1, num2) * divide(num1, num2); 
case.1 
int i = 0;
int j = 0; 
int k = 0; 

if (++i || ++j && ++k)
{
	printf("true!\n");
}
printf("%d, %d, %d\n", i , j, k);

case.2
int i = 0; int j = 0; int k = 0; 

if (++i || ++j && ++k)
{
	printf("true!\n");
}
printf("%d, %d, %d\n", i , j, k);

결과값은??????
#. case1 -> true! 1,0,0

  • || && -> 시퀀스 포인트
    (얘네앞에 오는애들 먼저 평가를 해야한다)
  • ++i 부터 실행해서 이미 조건 충족하고 이후 코드는 평가하지 않는다.
  • short circuit 평가: 이미 왼쪽 피연산자가 참이므로 오른쪽 피연산자를 검사할 필요도 없음.

#. case2 -> 1,1,1, true!

  • i=o인 상태에서 || 평가 -> false (그 후에 i=1, ++j ++k 평가 후 && 평가
profile
Hakuna Matata

0개의 댓글