-3

표현식을 계산 한 후 또는 전체 구문을 계산 한 후 후위 증가/감소 연산자를 평가합니까?후위 증가 연산자 평가

#include<stdio.h> 

void main() 
{ 
    int a=0; 
    int b=0; 

    printf("%d %d",a||b,b++); // Output is 1 0 

} 

내 컴파일러는 오른쪽에서 왼쪽으로 printf 인수를 계산합니다. 표현식 a || b의 대답은 1입니다. 즉, | b가 계산되기 전에 b가 증가했음을 의미합니다 (즉, b는 표현식 b ++을 평가 한 직후에 증가합니다).

여기서 읽습니다. Incrementing in C++ - When to use x++ or ++x? 그 후미 증가/감소 전체 진술 후에 평가됩니다.

올바른 내용은 무엇입니까?

+6

어느 쪽도 맞지 않습니다. 동작은 정의되지 않습니다.https://stackoverflow.com/questions/949433/why-are-these-constructs-using-undef-behavior – interjay

+0

을 참조하십시오. 너무 많은 upvotes를받은 답변이 잘못 되었습니까? –

+0

@interjay 일반적으로 변수가 동일한 명령문에서 반복되지 않는 경우의 동작은 무엇입니까? postfix는 표현식을 평가 한 후 또는 전체 문장을 평가 한 후에 변수의 값을 증가 시킵니까? –

답변

6

함수 인수의 평가 순서는 지정되지 않습니다. 인수 평가와 관련된 모든 부작용은 컨트롤이 호출 된 함수에 전달되기 전에 적용됩니다.

는 C 표준에서

(6.5.2.2 함수 호출)

10 기능 지정자의 평가와 실제 인수 후에하지만 실제 호출하기 전에 일련의 지점이 있습니다. 여기

은 예시적인 프로그램을 인

#include <stdio.h> 

struct 
{ 
    int x; 
} a = { 0 }; 

void f(int x) 
{ 
    printf("x = %d\n", x); 
    printf("a.x = %d\n", a.x); 
} 

int main(void) 
{ 
    f(a.x++); 
} 

출력은 하나 개의 인수는 다른 인수 및 부작용에 의존 이에 호출 부작용에

x = 0 
a.x = 1 

인 부작용에 대한 평가가 불확실한 순서로 이루어진다.

printf("%d %d",a||b,b++); 

프로그램에 정의되지 않은 동작이 있습니다.

피연산자 평가 사이에 부작용이있는 경우 C에 네 개의 연산자가 있습니다. 논리 AND 연산자 (& &), 논리 OR 연산자 (||) 쉼표 연산자 (,) 및 조건부 연산자 (? :)입니다. 예를 들어

#include <stdio.h> 

int main(void) 
{ 
    int x = 0; 

    printf("x = %d\n", x++ == 0 ? x : x - 1); 
} 

프로그램 출력

x = 1 

x++ 평가 부작용이 평가 전에 발현 애프터 x 서열화 하였다인가? 기호.

+0

"aschepler"(대답 아래)는 "f (x ++);에서 f가 호출되기 전에 증가가 발생 함을 나타냅니다. 그래서 당신의 예제에서 증분은 f를 호출하기 전에 일어 났어야합니까? –

+0

@SagarP 증가는 인수 x ++ (값이 증가하기 전에 피연산자의 값)를 계산 한 후 함수 본문이 실행되기 전에 호출 된 함수에 컨트롤이 전달되기 전에 발생합니다. –

+0

시퀀스 포인트 이전에는 이전 값이 그대로 남아서 반환되지만 시퀀스 포인트에 도달 한 후에는 다른 변수에서 사용할 수있는 새 증분 값을 사용할 수 있습니까? –

0

내가 링크 한 질문의 맨 위 대답은 정확하지 않습니다. x++의 증분은 표현식의 값을 판별 한 다음, 때로는 포함 된 표현식을 평가하기 전에 만 보장되지만, _ 생한 경우에는 다른 보증이 없습니다.

특히, 동일한 함수 호출에 대한 인수의 부작용이 불확실한 순서로 지정되기 때문에 해당 프로그램에는 정의되지 않은 동작이 있습니다.

+0

일반적으로 변수가 동일한 명령문에서 반복되지 않는 경우의 동작은 무엇입니까? postfix는 표현식을 평가 한 후 또는 전체 문장을 평가 한 후에 변수의 값을 증가 시킵니까? –

+0

@SagarP 그것은 다릅니다. 'f (x ++);'에서, 증가는'f'를 호출하기 전에 발생합니다. 'g() + x ++'에서, 증가가'g()'를 호출하기 전이나 후에 발생하는지에 대한 보장은 없다. – aschepler

+0

f (x--)에서 f를 호출하기 전에 x가 실제로 감소합니까? 나는 여전히 f (n--)를 호출했고 n의 값이 전혀 감소하지 않았기 때문에 코드가 무한 재귀에 들어갔다는 것을 기억합니다. –