本文适用于大学的期中期末考试、专升本(专接本、专插本)考试、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
的原始值为0x55
,c
的值为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 += b
,a
变为5 + 10 = 15
。- 然后执行
a - b
,但这个表达式的结果不会影响a
的值,只是参与求值过程。- 最后执行
a * b
,此时a
是 15,b
是 10,所以a * b
的结果是150
。- 因此,
c
被赋值为最后一个表达式的结果,即150
。
第九道题:
- 答案:10
- 解析:
- 初始化时
i = 1
,j = 2
,k = 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语言程序设计·第二章·运算符及其优先级关系(练习题二)》部分到这里就结束了,请及时用习题巩固所学知识,也欢迎大家在评论区进行互动!