衡庐浅析·C语言程序设计·第二章·运算符及其优先级关系(练习题二)

       本文适用于大学的期中期末考试、专升本(专接本、专插本)考试、408等考研预科。如有相关题目疑问或建议欢迎在评论区进行互动。

       转载请标明出处。


我们再列出一些关于运算符及其优先级关系的课后练习题,方便大家巩固知识点。

点击题目上方标题,即可跳转至解析。

第一道题:

int a = 2, b = 5;
int result = a << 2 | b;

第二道题:

int a = 1, b = 2, c = 3;
int result = (a < c) ? a + b : c;

第三道题:

给定两个整数 a 和 b,
int a = 25; // 二进制表示:00011001
int b = 9;  // 二进制表示:00001001
计算表达式 (~a) & (b << 2) 的结果

第四道题:

假设有一个结构体 Student,定义如下:
struct Student
{
  char name[20];
  int age;
  char gender;  // 'M' for male, 'F' for female
};
编写一个程序片段,使用 sizeof 运算符来计算 Student 结构体中 age 成员相对于结构体起始地址的偏移量。

第五道题:

int main()
{
  int x = 10, y = 20;
  y += x <<= 2;
  printf("%d\n", y);
  return 0;
}
计算程序的输出结果。

第六道题:

int main()
{
  int a = 5, b = 0;
  a *= b ? b : 3;
  printf("%d\n", a);
  return 0;
}
计算程序的输出结果。

第七道题:

int main()
{
  int a = 0x7F;  //二进制表示: 0111 1111
  int b = 0x55;  //二进制表示: 0101 0101
  int c = 0xAA;  //二进制表示: 1010 1010
  a ^= b ^= c;
  printf("%X\n", a);
  return 0;
}
计算程序的输出结果。

第八道题:

int main()
{
  int a = 5, b = 10, c;
  c = (a += b, a - b, a * b);
  printf("%d\n", c);
  return 0;
}
计算程序的输出结果。

第九道题:

int main()
{
  int i = 1, j = 2, k = 3;
  for (i += j * 2, j = i - 1; i < 10; i = i + 1 >> 1)
  {
    k += i;
  }
  printf("%d\n", k);
  return 0;
}
计算程序的输出结果。

第十道题:

假设 int a = 3; 和 int b = 4;
int result = (a + b) * (a * b) - (a << b) + a++;
求 result 和 a 的值。

以下为题目答案及解析:

第一道题:
  • 答案:result 的值为 13。
  • 解析:
  • 先进行左移运算a << 2 将 2 左移两位,得到 8。
  • 再进行按位或运算8 | b(即 8 或 5),结果为 13。
第二道题:
  • 答案:result 的值为 3。
  • 解析:
  • 先计算三元运算符的条件 (a < c),由于 1 < 3,条件为真。
  • 再根据三元运算符的规则,选择第一个表达式执行a + b 得到 3。
第三道题:
  • 答案:00100100 或 36
  • 解析:
  • a 的二进制表示为 00011001
  • 按位取反 ~a 的结果是 11100110
  • b 左移两位 b << 2 的结果是 00100100
  • 按位与 (~a) & (b << 2) 的结果是 00100100,即十进制的 36。
第四道题:
  • 答案:
    struct Student
    {
      char name[20];
      int age;
      char gender;
    };
    
    int main()
    {
      printf("Offset of age in Student struct: %zu\n", offsetof(struct Student, age));
      return 0;
    }

  • 解析:
  • ffsetof 宏不是C语言标准的一部分,但它在 <stddef.h> 中定义,用于获取结构体成员的偏移量。
  • offsetof(struct Student, age) 计算 age 成员在 Student 结构体中的偏移量。
  • 由于 name 是一个字符数组,其大小为20字节,所以 age 的偏移量将是20字节。
第五道题:
  • 答案:70
  • 解析:
  • 首先,x <<= 2 执行,这是一个左移运算,相当于 x 乘以 2 的 2 次方,即 10 * 4,结果为 40。
  • 然后,y += x 执行,此时 x 的值已经是 40,所以 y 更新为 20 + 40,结果为 60。
  • 因此,程序输出的结果是 60。
第六道题:
  • 答案:0
  • 解析:
  • 首先,b ? b : 3 是一个三元运算符,由于 b 的值为 0,条件为假,所以选择 : 3 中的值,即 3。
  • 然后,a *= 3 执行,这是一个乘法赋值运算,相当于 a 乘以 3,但由于 b 为 0,整个表达式的结果为 0,所以 a 更新为 0。
  • 因此,程序输出的结果是 0。
第七道题:
  • 答案:0x89
  • 解析:
  • 首先,需要理解 b ^= c 首先执行,因为运算符的优先级是从右到左。
  • b 的原始值为 0x55c 的值为 0xAA。按位异或后,b 的新值为 0xFF(因为 0101 0101 异或 1010 1010 得到 1111 1111)。
  • 然后,a ^= b 执行,a 的原始值为 0x7F。异或操作 0111 1111 与 1111 1111 得到 0000 0000
  • 但是,由于 a ^= b ^= c 实际上等同于 a ^= (b ^= c)a 的最终值是由 0x7F 异或 0xFF 得到的,即 0x89
  • 因此,程序输出的结果是 0x89
第八道题:
  • 答案:45
  • 解析:
  • 逗号运算符 (,) 按照从左到右的顺序执行,并将最后一个表达式的结果作为整个表达式的结果。
  • 首先执行 a += ba 变为 5 + 10 = 15
  • 然后执行 a - b,但这个表达式的结果不会影响 a 的值,只是参与求值过程。
  • 最后执行 a * b,此时 a 是 15,b 是 10,所以 a * b 的结果是 150
  • 因此,c 被赋值为最后一个表达式的结果,即 150
第九道题:
  • 答案:10
  • 解析:
  • 初始化时 i = 1j = 2k = 3
  • 循环的初始化部分 i += j * 2 首先执行,根据优先级,先计算 j * 2,结果是 4,然后 i 更新为 1 + 4,即 i = 5
  • 接着 j = i - 1 执行,j 更新为 4。
  • 循环条件 i < 10 为真,进入循环体。
  • 循环体内部,i = i + 1 >> 1 执行,首先 i + 1 为 6,然后执行右移操作 6 >> 1,结果是 3,i 更新为 3。
  • k += i 执行,k 更新为 3 + 3,即 k = 6
  • 循环的迭代部分 i = i + 1 >> 1 再次执行,i 更新为 4(3 + 1 然后右移一位)。
  • 循环条件 i < 10 仍然为真,循环继续。
  • 循环体再次执行,k 更新为 6 + 4,即 k = 10
  • 迭代部分再次执行,i 更新为 2(4 + 1 然后右移一位),此时 i 不满足循环条件 i < 10,循环结束。
  • 最终 k 的值是 10。
第十道题:
  • 答案:39,4
  • 解析:
  • 首先,根据运算符优先级,先计算括号内的表达式 (a + b) 和 (a * b),结果分别为 3 + 4 和 3 * 4,即 7 和 12。
  • 然后执行乘法 (a + b) * (a * b),即 7 * 12,结果为 84。接下来计算左移表达式 (a << b),即 3 << 4,结果是 48(因为左移4位相当于乘以2的4次方,即16)。
  • 然后执行减法 84 - 48,结果为 36。
  • 接着执行后缀自增 a++a 的原始值是 3,表达式的结果是 3,但 a 增加到 4。
  • 最后执行加法 36 + 3,结果为 39。
  • 由于 a++ 是后缀自增,所以 a 的最终值是 4,但对表达式的结果没有影响。

《衡庐浅析·C语言程序设计·第二章·运算符及其优先级关系(练习题二)》部分到这里就结束了,请及时用习题巩固所学知识,也欢迎大家在评论区进行互动!

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值