2025.10.28 C语言程序设计上机实习二

2025.10.28 C语言程序设计上机实习二

题目一:内存图的绘制

实际输出结果:

1
2
3
4
5
6
7
s13665@ubuntu:~/codes/20251028$ ./question1
Address of ch: 0x7ffeaee82527, Value: X
Address of arr: 0x7ffeaee82530, arr[0]: 10
Address of arr[1]: 0x7ffeaee82534, Value: 20
Address of arr[2]: 0x7ffeaee82538, Value: 30
Address of num: 0x7ffeaee82528, Value: 100
Address of f: 0x7ffeaee8252c, Value: 3.140000

内存布局图:image-20251028192056596

题目二:运算符与表达式求值的逆向解析

程序的完整源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

int main(void)
{
int a=10, b=3, c=0; //声明变量

//Step1 输出原始值
printf("Initial values: a=%d, b=%d, c=%d\n", a, b, c);

//Step2 计算a / b并输出
c = a / b; //执行除法运算,并将结果赋给 c
printf("After a / b: c=%d, a=%d, b=%d\n", c, a, b);

//Step3 计算a % b并输出
c = a % b; //执行取余运算,并将结果赋给 c
printf("After a %% b: c=%d, a=%d, b=%d\n", c, a, b);

//Step4 a前置自增并输出
printf("After ++a: c=%d, a=%d, b=%d\n", c, ++a, b); //a自增,在输出a之前对a执行自增运算

//Step5 b后置自减并输出
printf("After b--: c=%d, a=%d, b=%d\n", c, a, b--); //在输出b之后对b执行自减运算

//Step6 使c赋值为a后置自增与b前置自减的积并输出
c = a++ * --b; //a自增,但不立即改变;b自减,立即改变
printf("After c = a++ * --b: c=%d, a=%d, b=%d\n", c, a, b);

//Step7 输出最终结果
//在Step4-6中,自增自减操作均独立成行,没有对输出造成影响
printf("Final values: a=%d, b=%d, c=%d\n", a, b, c);

return 0;
}

程序的实际运行输出:

1
2
3
4
5
6
7
8
s13665@ubuntu:~/codes/20251028$ ./question2
Initial values: a=10, b=3, c=0
After a / b: c=3, a=10, b=3
After a % b: c=1, a=10, b=3
After ++a: c=1, a=11, b=3
After b--: c=1, a=11, b=3
After c = a++ * --b: c=11, a=12, b=1
Final values: a=12, b=1, c=11

题目三:逻辑与关系表达式的逆向解析

程序的完整源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
int main(void)
{
int x = 5, y = 0, z = 1, result;
printf("Initial values: x=%d, y=%d, z=%d\n", x, y, z);// 初始值由int声明时赋予
// 计算 x > 3,将结果赋给 result
result = ( x > 3 );
// printf 打印输出
printf("After x > 3: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// x > 3 为真,5 > 3,故result为真(1)
// 计算 y == 0,将结果赋给 result
result = ( y == 0 );
// printf 打印输出
printf("After y == 0: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// y == 0 为真,0 == 0,故result为真(1)
// 计算 z != 1,将结果赋给 result
result = ( z != 1 );
// printf 输出
printf("After z != 0: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// z != 0 为假,z == 0,故result为假(0)
// 计算 x > 3 && y == 0,将结果赋给 result
result = ( x > 3 && y == 0 );
// printf 打印输出
printf("After x > 3 && y == 0: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// &&是逻辑与运算符,要求两边同时为真。变量x的值大于3,且变量y的值等于0,左右两个条件同时满足,所以逻辑与运算的结果为真(1)
// 计算 x > 3 && z != 1,将结果赋给 result
result = ( x > 3 && z != 1 );
// printf 打印输出
printf("After x > 3 && z != 1: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// &&是逻辑与运算符,要求两边同时为真。变量x的值大于3,且变量z的值不等于1,前一条件满足,后一条件不满足,所以逻辑与运算的结果为假(0)
// 计算 x <= 3 || y == 0,将结果赋给 result
result = ( x <= 3 || y == 0 );
// printf 打印输出
printf("After x <= 3 || y == 0: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// ||是逻辑或运算符,要求有一为真即可为真。变量x的值小于等于3,或y的值为0,后者满足条件,所以逻辑或运算的结果为真(1)
// 计算 !y,将结果赋给 result
result = ( !y );
// printf 打印输出
printf("After !y: result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// !为逻辑非运算符,y的值为0为非,取反后为真,所以逻辑非运算的结果为真(1)
// 计算 !(x > 3 && y == 0),将结果赋给 result
result = ( !(x > 3 && y == 0) );
// printf 打印输出
printf("After !(x > 3 && y == 0): result=%d, x=%d, y=%d, z=%d\n", result, x, y, z);
// 括号在这里用于改变(提高)运算优先级,先执行括号内部的逻辑表达式 x > 3 && y == 0
// 如果没有括号,逻辑非运算符 ! 的优先级高于 &&,会先计算 !x,再与后续表达式进行运算,将会完全改变表达式的逻辑含义,导致结果错误
// !为逻辑非运算符,用于对其后的布尔值(或可转换为布尔值的表达式)进行取反操作,这里对表达式的计算结果进行取反
// 根据上一步语句可知,括号内的表达式 x > 3 && y == 0 的结果为 1(真)
// 因此 !(x > 3 && y == 0) 等价于 !1,逻辑非运算的结果为 0(假)
// 所以此处的 result 变量被赋值为 0
printf("Final values: x=%d, y=%d, z=%d, result=%d\n", x, y, z, result);
// 本题目仅对result的值进行了改变,且输出结果前未再次对result进行操作
return 0;
}

程序的实际运行输出:

1
2
3
4
5
6
7
8
9
10
11
s13665@ubuntu:~/codes/20251028$ ./question3
Initial values: x=5, y=0, z=1
After x > 3: result=1, x=5, y=0, z=1
After y == 0: result=1, x=5, y=0, z=1
After z != 0: result=0, x=5, y=0, z=1
After x > 3 && y == 0: result=1, x=5, y=0, z=1
After x > 3 && z != 1: result=0, x=5, y=0, z=1
After x <= 3 || y == 0: result=1, x=5, y=0, z=1
After !y: result=1, x=5, y=0, z=1
After !(x > 3 && y == 0): result=0, x=5, y=0, z=1
Final values: x=5, y=0, z=1, result=0

题目四:使用 ?: 运算符求最大值

程序的完整源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(void)
{
int A, B, C, max; //声明变量
scanf("%d%*c%d%*c%d", &A, &B, &C); //输入
max = A > B ? (A > C ? A : C) : (B > C ? B : C);
// 比大小
// 先判断 A 和 B 的大小;
// 如果 A > B,则进一步比较 A 和 C,将较大值赋给 max
// 如果 A ≤ B,则进一步比较 B 和 C,将较大值赋给 max
printf("The maximum of A=%d, B=%d, C=%d is %d.\n", A, B, C, max);
return 0;
}

程序的实际运行输出:

1
2
3
s13665@ubuntu:~/codes/20251028$ ./question4
15 8 23
The maximum of A=15, B=8, C=23 is 23.