면접 문제: 매크로 정의 #define TRACE(S)(printf("%s\n", #S),S)

1840 단어 면접 문제
다음 프로그램의 출력 결과는 얼마입니까?
#include <stdio.h>
#include <string.h>
#define TRACE(S)(printf("%s
",#S),S) int main(){ int a=5; int b=TRACE(a); const char *str="hello"; char des[50]; strcpy(des,TRACE(str)); printf("%s
",des); return 0; }

결과:
a
str
hello
분석:
printf("%s
",#S)
# 매크로 문자열 연결은
printf("%s
","S")
그래서 TRACE(a), TRACE(str)를 할 때 출력하는 것은 5와hello가 아니라 그 자체, a와str이다.
게다가 매크로 정의는 쉼표 연산자로 printf와 S 두 항목으로 구성되어 있기 때문에 TRACE(str)의 값은 뒤의 값, 즉str이다
2. 매크로를 사용하여 구조체의 메모리 편향 주소를 정의한다
#include <stdio.h>
#include <string.h>
#define OffSet(type,field)((size_t)&(((type*)0)->field))

struct str{
	char a;
	int b;
	float c;
	double d;
	char e;
};
int main(){
	printf("%d
",OffSet(str,a)); printf("%d
",OffSet(str,b)); printf("%d
",OffSet(str,c)); printf("%d
",OffSet(str,d)); printf("%d
",OffSet(str,e)); return 0; }

3. #define과 typedef의 차이점
#include <stdio.h>
#include <string.h>

#define INTPTR1 int*
typedef int * INTPTR2;

int a=1;
int b=2;
int c=3;
const INTPTR1 p1=&a;
const INTPTR2 p2=&b;
INTPTR2 const p3=&c;
int main(){
	p1=&c;
	printf("%d
",*p1); *p2=20; printf("%d
",*p2); *p3=30; printf("%d
",*p3); return 0; }

이상 문법은 정확하지만
*p1=10;
p2=&a;
p3=&a;
다 틀렸어요.
즉,
const INTPTR1 p1은 p1이 상수 바늘임을 나타낸다. p1을 통해 p1이 가리키는 내용을 수정할 수 없지만 p1은 다른 내용을 가리킬 수 있다.
const INTPTR2 p2는 p2가 포인터 상수로서 p2가 다른 내용을 가리킬 수 없지만 p2를 통해 가리키는 내용을 수정할 수 있습니다
p3과 p2는 같다

좋은 웹페이지 즐겨찾기