12 개의 익살 스 러 운 C 언어 면접 문답 - '12 개의 재 미 있 는 C 언어 문답' 평가 분석 (5)
5127 단어 C 언어
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 의 최종 값 을 확인 하 는 데 사용 되 지 않 기 때문에 이 코드 는 의미 없 는 정의 되 지 않 은 행위 에 속 합 니 다.
그래서 이 문답 은 모두 두 곳 이 틀 렸 다. 하 나 는 "매개 변 수 는 모두 오른쪽 에서 왼쪽으로 처리 된다" 는 것 이 고, 다른 하 나 는 코드 행동 이 정의 되 지 않 았 다 는 것 이다.
(전문 완료)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.