第1题
🎗观察并分析以下代码的结果
#include
int cnt = 0;
int fib(int n)
{cnt++;if(n == 0)return 1;else if(n == 1)return 2;elsereturn fib(n - 1) + fib(n - 2);
}
void main()
{fib(8);printf("%d\n", cnt);return 0;
}
📝 分析:
所以输出结果为 67
第2题
🎗观察并分析以下代码的结果
#include
int a = 1;
void test()
{int a = 2;a += 2;
}
int main()
{test();printf("%d\n", a);return 0;
}
📝 分析:
虽然全局变量名和局部变量名冲突时,局部变量优先,但是 test 函数内的局部变量在函数结束后就销毁了,所以这里看到的结果是全局变量 1
第3题
🎗观察并分析以下代码的结果
#include
int i;
int main()
{i--;if(i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0;
}
&#x1f4dd; 分析&#xff1a;
这里有几个需要注意的点&#xff1a;
1️⃣ 全局变量在未初始化时默认是0
2️⃣ sizeof 操作符算出的结果是 unsigned 类型的
3️⃣ signed 和 unsigned 类型的元素去比较大小时&#xff0c;会把 signed 转换为 unsigned
❗ 关键步骤如下 ❕
▶ int i ; -> 因为 i 是全局变量&#xff0c;所以 i 的初始值是 0
▶ i - - ; -> 此时 i 等于 - 1
▶ i > sizeof ( i ) ; -> 这里的 i 是 signed 类型的&#xff0c;而 sizeof 计算的结果是 unsigned 类型的&#xff0c;所以这里进行的是
unsigned 类型的比较&#xff0c;-1 转换成无符号类型将是一个很大的数字&#xff0c;所以这里输出的结果是 >
第4题
&#x1f397;观察并分析以下代码的结果
#include
int main()
{unsigned char a &#61; 200;unsigned char b &#61; 100;unsigned char c &#61; 0;c &#61; a &#43; b;printf("%d %d\n", a &#43; b, c);return 0;
}
&#x1f4dd; 分析&#xff1a;
unsigned a &#61; 200 ; unsigned b &#61; 100 ;
正数 (unsigned) 的原反补相同&#xff1a;
00000000 00000000 00000000 11001000 00000000 00000000 00000000 01100100
a、b 的类型都是 char 类型的&#xff0c;所以需要截断&#xff1a;
11001000 01100100
c &#61; a &#43; b ; 这里将进行整型提升&#xff0c;无符号类型的整型提升高位补 0
00000000 00000000 00000000 11001000 &#43; 00000000 00000000 0000000001100100
00000000 00000000 00000001 00101100
a &#43; b ; 就是整型提升后相加的值 300
c ;这里把整型提升后相加的值存储于 char 类型的变量 c 里&#xff0c;所以还需要截断&#xff0c;所以是 44
第5题
&#x1f397;观察并分析以下代码的结果
#include
int main()
{int aa[2][5] &#61; { 10,9,8,7,6,5,4,3,2,1 };int* ptr1 &#61; (int*)(&aa &#43; 1);int* ptr2 &#61; (int*)(*(aa &#43; 1);printf("%d, %d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}
&#x1f4dd; 分析&#xff1a;
对于数组名有几个特例&#xff1a;
1️⃣ sizeof (数组名)&#xff1a;此时计算的是整个数组的大小
2️⃣ &数组名&#xff1a;此时取出的是整个数组的地址
3️⃣ 除上例两种情况以外&#xff0c;其余代表数组的首地址
第6题
&#x1f397;观察并分析以下代码的结果
#include
int main()
{int a[5] &#61; { 5,4,3,2,1 };int* ptr &#61; (int*)(&a &#43; 1);printf("%d, %d", *(a &#43; 1), *(ptr - 1));return 0;
}
&#x1f4dd; 分析&#xff1a;
第7题
&#x1f397;观察并分析以下代码的结果
#include
#include
int main()
{unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData &#61; (struct tagPIM*)puc;memset(puc,0,4);pstPimData->ucPim1 &#61; 2; pstPimData->ucData0 &#61; 3;pstPimData->ucData1 &#61; 4;pstPimData->ucData2 &#61; 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);return 0;
}
&#x1f4dd; 分析&#xff1a;
第8题
&#x1f397;观察并分析以下代码的结果
#include
union Un
{short a[7];int n;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}
&#x1f4dd; 分析&#xff1a;
对于联合体大小的计算有几个注意的点&#xff1a;
1️⃣ 联合体的大小至少是最大成员的大小&#xff0c;但不一定是最大成员的大小
2️⃣ 联合体也存在内存对齐
3️⃣ 当最大成员大小不是最大对齐数的整数倍时&#xff0c;就要对齐到最大对齐数的整数倍
第9题
&#x1f397;观察并分析以下代码的结果
#include
int main()
{union{short k;char i[2];}*s, a;s &#61; &a;s->i[0] &#61; 0x39;s->i[1] &#61; 0x38;printf("%x\n",a.k);return 0;
}
&#x1f4dd; 分析&#xff1a;
第10题
&#x1f397;观察并分析以下代码的结果
#include
int main()
{unsigned char i &#61; 7;int j &#61; 0;for(; i > 0; i -&#61; 3){&#43;&#43;j;}printf("%d\n", j);return 0;
}
&#x1f4dd; 分析&#xff1a;
signed char 类型变量的取值范围是 -127 ~ 128
unsigned char 类型变量的取值范围是 0 ~ 255
❗ 进入循环后 i 的变化 ❕
7&#xff0c;4&#xff0c;1&#xff0c;254&#xff0c;251&#xff0c;248 … 5&#xff0c;2&#xff0c;255 …
❓ 循环到哪停止呢 ❔
只有当 i 等于 0 的时候循环才停止
这里计算一下&#xff1a;
7&#xff0c;4&#xff0c;1 ; 这里执行了 3 次
254 - 3 * 85 &#61; 255 ; 从 254 到 255 减了 85 个 3
255 - 3 * 85 &#61; 0 ; 从 255 到 0 减了 85 个 3
总共程序执行了 173 次
7&#xff0c;4&#xff0c;1&#xff0c;254&#xff0c;251&#xff0c;248&#xff0c;245&#xff0c;242&#xff0c;239&#xff0c;236&#xff0c;233&#xff0c;230&#xff0c;227&#xff0c;224&#xff0c;221&#xff0c;218&#xff0c;215&#xff0c;212&#xff0c;209&#xff0c;206&#xff0c;203&#xff0c;200&#xff0c;197&#xff0c;194&#xff0c;191&#xff0c;188&#xff0c;185&#xff0c;182&#xff0c;179&#xff0c;176&#xff0c;173&#xff0c;170&#xff0c;167&#xff0c;164&#xff0c;161&#xff0c;158&#xff0c;155&#xff0c;152&#xff0c;149&#xff0c;146&#xff0c;143&#xff0c;140&#xff0c;137&#xff0c;134&#xff0c;131&#xff0c;128&#xff0c;125&#xff0c;122&#xff0c;119&#xff0c;116&#xff0c;113&#xff0c;110&#xff0c;107&#xff0c;104&#xff0c;101&#xff0c;98&#xff0c;95&#xff0c;92&#xff0c;89&#xff0c;86&#xff0c;83&#xff0c;80&#xff0c;77&#xff0c;74&#xff0c;71&#xff0c;68&#xff0c;65&#xff0c;62&#xff0c;59&#xff0c;56&#xff0c;53&#xff0c;50&#xff0c;47&#xff0c;44&#xff0c;41&#xff0c;38&#xff0c;35&#xff0c;32&#xff0c;29&#xff0c;26&#xff0c;23&#xff0c;20&#xff0c;17&#xff0c;14&#xff0c;11&#xff0c;8&#xff0c;5&#xff0c;2&#xff0c;255&#xff0c;252&#xff0c;249&#xff0c;246&#xff0c;243&#xff0c;240&#xff0c;237&#xff0c;234&#xff0c;231&#xff0c;228&#xff0c;225&#xff0c;222&#xff0c;219&#xff0c;216&#xff0c;213&#xff0c;210&#xff0c;207&#xff0c;204&#xff0c;201&#xff0c;198&#xff0c;195&#xff0c;192&#xff0c;189&#xff0c;186&#xff0c;183&#xff0c;180&#xff0c;177&#xff0c;174&#xff0c;171&#xff0c;168&#xff0c;165&#xff0c;162&#xff0c;159&#xff0c;156&#xff0c;153&#xff0c;150&#xff0c;147&#xff0c;144&#xff0c;141&#xff0c;138&#xff0c;135&#xff0c;132&#xff0c;129&#xff0c;126&#xff0c;123&#xff0c;120&#xff0c;117&#xff0c;114&#xff0c;111&#xff0c;108&#xff0c;105&#xff0c;102&#xff0c;99&#xff0c;96&#xff0c;93&#xff0c;90&#xff0c;87&#xff0c;84&#xff0c;81&#xff0c;78&#xff0c;75&#xff0c;72&#xff0c;69&#xff0c;66&#xff0c;63&#xff0c;60&#xff0c;57&#xff0c;54&#xff0c;51&#xff0c;48&#xff0c;45&#xff0c;42&#xff0c;39&#xff0c;36&#xff0c;33&#xff0c;30&#xff0c;27&#xff0c;24&#xff0c;21&#xff0c;18&#xff0c;15&#xff0c;12&#xff0c;9&#xff0c;6&#xff0c;3&#xff0c;0