면접 문제: 매크로 정의 #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는 같다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 프로그래머 면접에서의 다중 스레드 문제 요약wait ()/notify ()/notify All () 의 모든 방법을 호출할 때, 현재 라인이 이 대상의 자물쇠를 얻지 못하면, Illegal MonitorState Exception의 이상을 던집니다. Thre...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.