Pixiv - 蒼ஐ/お仕事募集中
1562 字
8 分钟
2025.10.28 C语言程序设计上机实习二
2025.10.28 C语言程序设计上机实习二
题目一:内存图的绘制
实际输出结果:
s13665@ubuntu:~/codes/20251028$ ./question1Address of ch: 0x7ffeaee82527, Value: XAddress of arr: 0x7ffeaee82530, arr[0]: 10Address of arr[1]: 0x7ffeaee82534, Value: 20Address of arr[2]: 0x7ffeaee82538, Value: 30Address of num: 0x7ffeaee82528, Value: 100Address of f: 0x7ffeaee8252c, Value: 3.140000内存布局图:
题目二:运算符与表达式求值的逆向解析
程序的完整源代码:
#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;}程序的实际运行输出:
s13665@ubuntu:~/codes/20251028$ ./question2Initial values: a=10, b=3, c=0After a / b: c=3, a=10, b=3After a % b: c=1, a=10, b=3After ++a: c=1, a=11, b=3After b--: c=1, a=11, b=3After c = a++ * --b: c=11, a=12, b=1Final values: a=12, b=1, c=11题目三:逻辑与关系表达式的逆向解析
程序的完整源代码:
#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;}程序的实际运行输出:
s13665@ubuntu:~/codes/20251028$ ./question3Initial values: x=5, y=0, z=1After x > 3: result=1, x=5, y=0, z=1After y == 0: result=1, x=5, y=0, z=1After z != 0: result=0, x=5, y=0, z=1After x > 3 && y == 0: result=1, x=5, y=0, z=1After x > 3 && z != 1: result=0, x=5, y=0, z=1After x <= 3 || y == 0: result=1, x=5, y=0, z=1After !y: result=1, x=5, y=0, z=1After !(x > 3 && y == 0): result=0, x=5, y=0, z=1Final values: x=5, y=0, z=1, result=0题目四:使用 ?: 运算符求最大值
程序的完整源代码:
#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;}程序的实际运行输出:
s13665@ubuntu:~/codes/20251028$ ./question415 8 23The maximum of A=15, B=8, C=23 is 23.文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
2025.10.28 C语言程序设计上机实习二
https://mjy.js.org/posts/20251028-c语言程序设计上机实习二/