2014-05-12 4 views
-2

누구든지 다음 C 프로그램의 결과를 설명해 주시겠습니까?다음 C 프로그램의 출력을 설명하십시오

#include<stdio.h> 

int main() 
{ 
    int i=2; 
    printf("%d %d %d",i,i++,++i); 
    return 0; 
} 

출력은 어떻게됩니까? 4 3 4?

+0

http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/cxx_crib/increment입니다.htaccess Admin Home English Language Content – Pavel

+3

방출 된 특정 값에 대한 적절한 답을 줄 수는 없지만 정의되지 않은 동작이라는 것을 알고 있습니다. C 표준은 매개 변수를 함수로 평가하는 순서를 지정하지 않습니다. –

+0

@ KarlNicoll이 말한 것 외에 컴파일러마다 출력이 다를 수 있습니다. 예를 들어 나는 clang으로 시도했지만 대신'2 2 4'를 주었다. – Brian

답변

3

인수 평가의 순서는 C++ 표준에 의해 정의되지 않습니다. 또한 "스칼라 객체의 부작용이 동일한 스칼라 객체의 다른 부작용과 비교하여 정렬되지 않은 경우 동작은 정의되지 않습니다."

따라서 동일한 함수 호출에 대한 인수와 동일한 스칼라 값에서 사후 증가 및 사전 증가가 정의되지 않습니다. 분명히 두 증분은 첫 번째 및 마지막 인수가 평가되기 전에 수행됩니다.

+0

첫 번째 문장은 지정하지 않아야합니다. – chris

0

i = 2으로 시작하십시오. i++++i 때문에 변수 i은 2 씩 증가합니다 (각 ++은 1을 더합니다). 따라서 끝나면 값은 4입니다.

i++ 구문을 사용하면 값을 증가시키기 전에 i 값을 사용한다고 명시되어 있습니다. (printfi++에서 얻을 수) 중간 번호가 4 3 4,하지 등 2 2 4 2 3 3 4 3 3 때 함께 할 수있다 뭔가 다른 인 이유 4.

수없는 이유입니다 printf 함수의 매개 변수가 설정된 경우와 비교하여 ++ 연산자가 계산됩니다. 사람이 실제로 사용해야하는 소프트웨어가 아니라 적어도 이런 코드를 작성하면 안됩니다.

0

당신은 정의되지 않은 행동의 땅에 입장했습니다. C는 인수가 함수에 전달되는 순서, 특히 varargs 함수가 평가되는 순서에 대해 보장하지 않습니다.

int i = 1; 
int a[3] = { 1, 2, 3 }; 
int j = a[i++] - a[++i]; 

j는 무엇인가는 등의 컴파일러 버전, 플랫폼 사이에서 변경할 수 있으며, 질문과 유사하다 - 고전적인 면접 질문은이 같은 성명의 결과는, "알 수없는"인가? 답 : 이것은 컴파일러, 버전, 플랫폼 등에 달려 있습니다. C 유추를 추론하는 데 사용할 수없는 한 가지가 있습니다.

하지만 3에 대해 궁금한가요? 컴파일러 내가 컴파일러가 i++ 평가 그런 다음 3으로 i을 증가하는 첫번째 ++ 평가하기 때문이다, 게시물이 동등한 구현 증가 (++ C에, 죄송합니다) :

int operator ++ (int) { // post-increment indicated by int parameter 
    int i = *this; 
    this->operator++(); 
    return i; 
} 

또는 기타 의사의 코드

int tempI = i; 
++i; 

그래서 당신이 실제로 쓴했다 : 인수를 평가하는 말

printf("%d %d %d\n", i, (j = i, ++i), ++i); 

가의 printf에 전달, i의 값 4 있었지만 i++ 의해 반환이 임시 따라서 3

의 값을 유지 4 (I) (3) (TEMP) 4 (I)

관련 문제