c语言逻辑运算和判断选取精选题
【c语言逻辑运算和判断选取精选题】
🍻适合计算机二级,考研复试,期末复习…
一、易错题
1.1👑 运算符的优先级
在 C 语言中,运算符的优先级顺序为:算术运算符优先级较高,用于进行基本的数值运算,如加、减、乘、除等;关系运算符用于比较大小、相等关系等,优先级低于算术运算符;逻辑与运算符(&&)用于逻辑判断,优先级低于关系运算符;赋值运算符用于给变量赋值,优先级是最低的。
答案C
逻辑运算符优先级由高到底如下:
优先级 | 运算符 | 名称/描述 | 示例 | 结合性 |
---|---|---|---|---|
1 | () [] . -> | 函数调用、成员访问 | a[5], obj.x | 左到右 |
2 | ! ~ ++ – - + | 逻辑非、位非、自增自减 | !flag, -num | 右到左 |
3 | * / % | 乘、除、取模 | a*b, 7%3 | 左到右 |
4 | + - | 加、减 | x+y, 5-3 | 左到右 |
5 | « » | 位移运算 | a«2, b»1 | 左到右 |
6 | < <= > >= | 关系运算符 | x>5, y<=10 | 左到右 |
7 | == != | 相等性判断 | a==0, b!=NULL | 左到右 |
8 | & | 位与 | flags & 0x01 | 左到右 |
9 | ^ | 位异或 | a ^ b | 左到右 |
10 | 位或 | x | ||
11 | && | 逻辑与 | cond1 && cond2 | 左到右 |
12 | 逻辑或 | |||
13 | ?: | 条件运算符 | x>0?1:0 | 右到左 |
14 | = += -= *= 等 | 赋值运算符 | a=5, b+=3 | 右到左 |
15 | , | 逗号运算符 | a=1, b=2 | 左到右 |
1.2👑三目运算符嵌套使用
这道题主要考查三目运算符的嵌套使用。三目运算符的格式为 表达式1 ? 表达式2 : 表达式3,当 表达式1 为真时,整个表达式的值为 表达式2 的值;当 表达式1 为假时,整个表达式的值为 表达式3 的值。
在 printf(“\n%d\n”, k<a ? k:c<b ? c:a); 中,先看最外层的三目运算符 k<a ? k:c<b ? c:a,判断条件是 k<a,已知 k = 4,a = 3,4<3 为假。
因为 k<a 为假,所以取冒号后面的部分,即 c<b ? c:a。再判断 c<b,已知 c = 1,b = 2,1<2 为真,所以取 c 的值。
因此,整个表达式的值为 c 的值,也就是 1。
答案D
1.3👑三角形的形状
【1】处是判断输入的a、b、c三边能否构成三角形。根据三角形的性质,任意两边之和要大于第三边,即a + b > c、a + c > b 、b + c > a ,同时边长不能为非正数,所以还需满足a > 0、b > 0、c > 0 ,这些条件需同时成立,用逻辑与&&连接。
【2】处是判断等边三角形。等边三角形的特征是三条边都相等,即a、b、c三边两两相等,用逻辑与&&连接a == b和b == c (因为若这两个成立,自然a == c也成立)来判断。
【3】处是判断等腰三角形。等腰三角形是至少有两条边相等,所以只要a == b 、a == c 、b == c这三个条件中有一个成立即可,用逻辑或||连接来实现判断 。
答案:
【1】(a + b > c) && (a + c > b) && (b + c > a) && (a > 0) && (b > 0) && (c > 0)
【2】(a == b) && (b == c)
【3】(a == b) || (a == c) || (b == c)
1.4👑 四个数排大小
程序从输入的四个数 a、b、c、d 开始,首先比较 a 和 b ,若 a < b ,就交换它们的值,这样能保证 a 大于等于 b 。
接着对 c 和 d 进行比较(即判断【1】处条件 c < d ),如果 c 小于 d ,交换二者的值,使得 c 大于等于 d 。
然后比较 a 和 c ,若 a < c ,交换它们的值,此时 a 成为 a 和 c 中的较大值。
再比较 b 和 c (即判断【2】处条件 b < c ),若 b 小于 c ,交换它们的值,保证 b 大于等于 c 。
之后分别比较 b 和 d 、c 和 d ,并在满足条件时交换值。
答案
【1】(c < d)
【2】(b < c)
1.5👑 同一变量连续递增递减
若有说明语句:int a = 1, b = 0; 则表达式 ++a * –a == b? 12%5:‘x’ 的的值【】
先看 ++a * –a 这部分:
++a 是先自增,a 的初始值为 1,执行 ++a 后,a 的值变为 2。
–a 是先自减,此时 a 的值为 2,执行 –a 后,a 的值变为 1。
然后计算乘法 ++a * –a,即 2 * 1,结果为 2。
接着看 ++a * –a == b 这个条件判断:
前面已算出 ++a * –a 的结果为 2,而 b = 0,所以 2 == 0 这个条件判断结果为 0(假)。
最后看整个条件表达式 ++a * –a == b? 12%5 : ‘x’:
因为条件 ++a * –a == b 为假,所以表达式的值取 : 后面的值,即 ‘x’。
答案 ‘x 或 120’
注意字符别忘记单引号’’,只写x是不对的!!!
当时马虎,++a * –a 两边同时对1增和对1减了!
1.6👑 判断闰年
解析
闰年的判断规则是:能被 400 整除的年份是闰年,此外能被 4 整除但不能被 100 整除的年份也是闰年。
第一个 if 语句 if(y%400==0) f = 1; 已经判断了能被 400 整除的情况。
接下来的 else if 应该判断能被 4 整除但不能被 100 整除的情况,所以【1】处应填入 (y % 4 == 0 && y % 100 != 0) ,当满足这个条件时,将 f 赋值为 1,表示是闰年。
前两个条件都不满足时,说明该年份不是闰年,所以【2】处应将 f 赋值为 0,即 f = 0; 。
答案
【1】(y % 4 == 0 && y % 100 != 0)
【2】f = 0;
1.7👑 if语句变switch
switch 语句的表达式需要一个能产生整数值的表达式,这里根据 if 语句是根据 mark 的值来判断,所以 switch 后的括号内应填 mark / 10,这样可以将 mark 的值映射到几个离散的整数值,方便与 case 后的常量表达式匹配。
对于 case 标签,根据 if 语句的条件,当 mark 在 60 以下时 k = 1,此时 mark / 10 的值小于 6,所以第一个 case 可以写成 case 0: case 1: case 2: case 3: case 4: case 5,都执行 k = 1 。
当 mark 在 60(含)到 70 之间时 k = 2,此时 mark / 10 的值为 6,所以有 case 6: k = 2; break; 。
当 mark 在 70(含)到 80 之间时 k = 3,此时 mark / 10 的值为 7,所以有 case 7: k = 3; break; 。
当 mark 在 80(含)到 90 之间时 k = 4,此时 mark / 10 的值为 8,所以有 case 8: k = 4; break; 。
当 mark 在 90(含)到 100 之间时 k = 5,此时 mark / 10 的值为 9 或者 10,所以可以写成 case 9: case 10: k = 5; break;
switch(mark / 10)
{
case 0: case 1: case 2: case 3: case 4: case 5: k = 1; break;
case 6 : k = 2; break;
case 7 : k = 3; break;
case 8 : k = 4; break;
case 9: case 10: k = 5; break;
}
1.8👑如何算优惠
第一个 switch 语句根据输入的汽油品种 b 来确定汽油的单价,已知汽油品种 ‘b’ 的单价是 1.35 ,所以【1】处应填入 r1 = 1.35 。
第二个 switch 语句根据输入的服务类型 c 来确定优惠率,已知服务类型 ‘e’ 对应的优惠率是 10%(即 0.1),所以【2】处应填入 ‘e’ 。
计算应付款 m 时,需要用汽油单价 r1 乘以加油量 a ,再乘以 (1 - 优惠率 r2) ,所以【3】处应填入 a * r1 * (1 - r2) 。
答案
【1】r1 = 1.35
【2】‘e’
【3】a * r1 * (1 - r2)\
注意是(1 - 优惠率 r2)!