5

방법은 아래 코드의 출력을 설명하기 :C - printf ("% d % d n", k = 1, k = 3)의 출력 설명;

include <stdio.h> 

int main(void) { 
    int k; 
    printf("%d %d\n",k=1,k=3); 
    return 0; 
} 

Ideone Link

내 생각 1k 변수에 할당됩니다 다음 1 인쇄 할 것이라고했다. 마찬가지로 3k에 할당되고 출력은 3이됩니다.

1 1 

내가

int a; 
if (a = 3) { 
    ... 
} 

에서 외삽하고

동일한 출력

1 3 

실제 출력도 예상

if (3) { ... } 

어디에서 잘못 되었습니까?

+0

@CinCout 미안 해요, 난 나중에 나타났습니다. –

답변

7

문제는 함수 인수의 평가 순서가 정의되지 않았고 평가 또는 인수 사이에 시퀀스 포인트가 없다는 것입니다. 당신이 사이에 일련의 포인트없이 두 번 이상 동일한 변수를 수정하려는 그래서,이 사항이

printf("%d %d\n",k=1,k=3) 

undefined behavior를 호출합니다.

UB를 호출하는 프로그램이 실행되고 출력이 있으면 어쨌든 정당화 될 수 없으며 결과는 아무거나 될 수 있습니다.

+1

괜찮습니다. 하나의 과제는'k'의 값을 인쇄합니다. 즉, 3입니다. –

+0

이 답변이 잘못되었습니다. http://stackoverflow.com/a/9514591/5473170. 그것을 확인할 수 있습니까? –

+0

@SurajJain 가장 좋은 것은 아니지만 일반적으로 좋아 보인다. 왜 그것이 틀렸다고 생각하니? –

-4

1 1이 나타나는 이유는 두 지정 문이 발생하고 제어가 printf으로 전달되기 때문입니다.

printf("%d %d\n",k=1,k=3); 

그래서 아래쪽 투표에 대한 응답으로, 그래,이이 정의되지 않은 동작이며, 따라서 당신은 계속이 동작에 포함되지해야합니다. 그러나 출력이 1 1이 아니고 1 3이 아닌 이유를 확인하는 측면에서 3의 지정이 1의 후속 할당으로 인해 수행되었을 수 있음을 알 수 있습니다.

printf가 호출 될 때 호출 스택에는 k의 최종 값을 포함하는 두 개의 항목이 포함되어 있습니다 (1).

실행하면 무언가를 인쇄하는 기능으로 대체하여이를 테스트 할 수 있습니다.

샘플 코드 :

#include <stdio.h> 

int test(int n) { 
    printf("Test(%d)\n", n); 
    return n; 
} 

int main(void) { 
    int k; 
    printf("%d %d\n",k=test(1), k=test(3)); 
    return 0; 
} 

출력 :

Test(3) 
Test(1) 
1 1 
+0

이것은 훨씬 더 인위적인 이유 인 가설에 대한 가난한 설명입니다. –

+1

@ q. 가난한 사람은 온화한 말입니다. 이것은 틀린 것입니다. –

+0

나는 나의 설명이 어째서 잘못되었는지 진정으로 궁금하다. 인수는 UB라는 다중 인수입니까? – Scovetta