12 개의 익살 스 러 운 C 언어 면접 문답 - '12 개의 재 미 있 는 C 언어 문답' 평가 분석 (5)

5127 단어 C 언어
링크: http://www.cnblogs.com/pmer/archive/2013/09/17/3327262.html 
A, 부분 변수의 반환 주소
Q: 아래 코드 에 문제 가 있 습 니까?있 으 면 어떻게 수정 합 니까?
#include<stdio.h>

int* inc(int val)
{
  int a = val;
  a++;
  return &a;
}

int main(void)
{
    int a = 10;

    int *val = inc(a);

    printf("
Incremented value is equal to [%d]
", *val); return 0; }

A: 위의 코드 는 때때로 잘 작 동 되 지만 방법 inc () 에 심각 한 위험 이 있 습 니 다.inc () 방법 이 실 행 된 후에 국부 변수의 주 소 를 다시 사용 하면 예측 할 수 없 는 결 과 를 초래 할 수 있 습 니 다.해결 의 길 은 변수 a 의 주 소 를 main () 에 전달 하 는 것 입 니 다.
Answer: Though the above program may run perfectly fine at times but there is a serious loophole in the function ‘inc()’. This function returns the address of a local variable. Since the life time of this local variable is that of the function ‘inc()’ so after inc() is done with its processing, using the address of its local variable can cause undesired results. This can be avoided by passing the address of variable ‘a’ from main() and then inside changes can be made to the value kept at this address.
평가:
이것 은 주로 번역 의 문제 다.원문 을 대조 해 보면 번역문 은 번역 되 지 않 은 많은 내용 을 빠 뜨 렸 을 뿐만 아니 라 가장 심각 한 것 은 'by passing the address of variable' a 'from main ()' 을 '전달 변수 a 의 주 소 를 main () 에' 로 번역 해 원문의 뜻 을 철저히 전복 시 켰 다 는 것 이다.원래 main () 에서 변수 a 의 주 소 를 전달 하 는 것 이 었 습 니 다. 즉, 호출 형식 은 int (& a) 이 고 번역문 의 뜻 은 코드 에 있 는 잘못된 쓰기 에 대한 설명 입 니 다.
 
B, printf () 인자 처리
Q: 다음 코드 출력 은 무엇 입 니까?
#include<stdio.h>

int main(void)
{
    int a = 10, b = 20, c = 30;

    printf("
%d..%d..%d
", a+b+c, (b = b*2), (c = c*2)); return 0; }

A: 출력 은
1 110..40..60
이것 은 매개 변 수 는 모두 오른쪽 에서 왼쪽으로 처리 한 다음 에 인쇄 된 것 이 왼쪽 에서 오른쪽으로 이기 때문이다.
Answer: The output of the above code would be :
110..40..60
This is because the arguments to the function are processed from right to left but are printed from left to right.
평가:
이 문제 와 해답 은 모두 막장 이다!
"매개 변 수 는 모두 오른쪽 에서 왼쪽으로 처리 합 니 다." 무 에서 유 를 창조 합 니 다.C 표준 규정
  The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.
즉, 실제 인삼 의 구 치 순 서 는 규정 (unspecified) 을 하지 않 았 고 컴 파일 러 는 스스로 계산 순 서 를 배정 할 수 있 으 며 아무리 배정 해도 기준 에 어 긋 나 지 않 는 다.오른쪽 에서 왼쪽으로, 오른쪽 에서 왼쪽으로 모두 가능 합 니 다."매개 변 수 는 모두 오른쪽 에서 왼쪽으로 처리 합 니 다" 라 고 단언 하 는 것 은 이 해답 에서 첫 번 째 오류 입 니 다.
앞에서 인용 한 조문 에 서 는 실제 호출 전에 하나의 순서 점 (sequence point) 이 존재 하 며 코드 에 대해 서도 언급 하 였 다.
printf("
%d..%d..%d
", a+b+c, (b = b*2), (c = c*2))

이 함수 호출 에 있어 서 앞의 순서 점 은 바로 이전의 ";" 이다.
C 언어의 또 다른 규정 은:
  Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.Furthermore, the prior value shall be read only to determine the value to be stored.
이 두 마디 말 은 무슨 뜻 입 니까?앞에서 말 한 것 은 두 개의 인접 점 사이 에 한 데이터 대상 의 값 이 최대 한 번 바 뀔 수 있다 는 것 이다.여러 번 바 뀌 면 정의 되 지 않 은 행동 이다.예 를 들 어 아래 코드 를 쓰 는 것 과 같다.
printf("%d,%d,%d,%d
", ++i, --i, i++, i--);

정의 되 지 않 은 행위 에 대한 전형 적 인 무지 에서 비롯 된 것 이다.이런 무의미 한 코드 (i + + 와 + i 를 매개 변수 로 할 때의 컴 파일 러 처리 방식 분석 ~) 를 흥미진진 하 게 토론 하 는 것 은 담 호 강 이 흥미진진 하 게 a + = a - = a * a 를 토론 하 는 것 처럼 황당 하 다 ("이 빨 에 입 이 길 어 요" 와 "a + = a - = a * a" 참조). ),내 가 닦 을 게, 어찌 천하 의 큰 우 스 꽝 스 러 운 일이 아니 겠 는가? 기 술 력 도 전혀 없고, 자신 을 잘 아 는 원부 도 부족 해 야 이런 터 무 니 없 는 일 을 할 수 있 을 것 이다.
표준 조문 의 뒷부분 은 좀 까다롭다. 데이터 대상 의 이전 값 은 데이터 대상 에 저 장 된 값 을 확인 하 는 데 만 사용 할 수 있다 는 뜻 이다. 예 를 들 어:
int i = 1;
i = i + 1 ;

i 는 한 번 만 바 뀌 었 고 i 의 원래 값 (1) 은 i 가 나중에 저장 한 값 (2) 을 확인 하 는 데 사용 되 었 다.
만약 에 데이터 대상 의 값 이 두 개의 순서 점 사이 에서 한 번 만 바 뀌 고 데이터 대상 의 원 가 는 데이터 대상 의 나중에 값 을 확인 하 는 데 사용 되 지 않 는 다. 예 를 들 어:
int i = 1 , j ;
j = i + (i = 2) ; 

정의 되 지 않 은 행동 입 니 다. 표현 식 의 첫 번 째 i 값 은 i 가 저장 할 값 을 확인 하기 위 한 것 이 아니 기 때 문 입 니 다. 이 i + (i = 2) 표현 식 의 값 이 4 인지 3 인지 아무 도 말 하지 않 습 니 다.
뒤 돌아 서 퀴즈 코드 에 있 는 거 봐.
printf("
%d..%d..%d
", a+b+c, (b = b*2), (c = c*2));

b 와 c 는 모두 한 번 바 뀌 었 지만 표현 식 a + b + c 에서 b 와 c 의 값 은 b 와 c 의 최종 값 을 확인 하 는 데 사용 되 지 않 기 때문에 이 코드 는 의미 없 는 정의 되 지 않 은 행위 에 속 합 니 다.
그래서 이 문답 은 모두 두 곳 이 틀 렸 다. 하 나 는 "매개 변 수 는 모두 오른쪽 에서 왼쪽으로 처리 된다" 는 것 이 고, 다른 하 나 는 코드 행동 이 정의 되 지 않 았 다 는 것 이다.
(전문 완료)

좋은 웹페이지 즐겨찾기