目录
判断
计算较大值
计算三个整数的最大数值
条件运算符
复合语句(程序块)
逻辑运算符
短路求值
容易出错的if语句
在扩起表达式的)后面加;
判断相等性使用=
判断三个变量相等性使用==
两个条件的判断不使用&&或||
使用以bit为单位的逻辑运算符代替逻辑运算符
表达式大部分情况下都有值,程序执行时会对表达式的值进行检测,这就称为判断。
下面我们举几个例子,方便大家理解:
按照初学时编写普通的程序想必我们已经得心应手,接下来我们引入一个中间变量,在数学上称之为等效替换:
#include
int main()
{
int n1, n2, max;
puts("请输入两个整数:");
printf("整数1:");scanf("%d", &n1);
printf("整数2:");scanf("%d", &n2);
if(n1 > n2) max = n1; else max = n2;
printf("较大的数是%d。\n", max);
return 0;
}
这里我们把最大值赋值给max,而max就可以作为中间变量替换n1或者n2。
在该程序有一个缺点,就是if语句写在了一行之内,如果当if语句冗长时,就会是可读性变得很差。
#include
int main()
{
int n1, n2, n3, max;
puts("请输入两个整数:");
printf("整数1:");scanf("%d", &n1);
printf("整数2:");scanf("%d", &n2);
printf("整数3:");scanf("%d", &n3);
max = n1;
if(n2 > max) max = n2;
if(n3 > max) max = n3;
printf("较大的数是%d。\n", max);
return 0;
}
在这里我们把n1的值赋值给max,把三个变量的大小比较转换为两两比较。
我们用下面的结构图来展示比较过程中变量数值的变化:
现在我们利用条件运算符来比较两个整数的大小
#include
int main()
{
int n1, n2, max;
puts("请输入两个整数:");
printf("整数1:");scanf("%d", &n1);
printf("整数2:");scanf("%d", &n2);
max = (n1 > n2) ? n1:n2;
printf("较大的数是%d。\n", max);
return 0;
}
条件运算符是需要三个操作数的三目运算符。
只有条件运算符属于三目运算符,其他的运算符都属于单目或双目运算符。
条件运算符 a ? b:c 如果a不为0,则结果是b,否则就是c |
下面我们来更详细地说明条件运算符是如何判断执行程序的:
我们仍然用比较大小来编写一段程序,只不过形式上有所不同:
#include
int main()
{
int n1, n2, max, min;
puts("请输入两个整数:");
printf("整数1:");scanf("%d", &n1);
printf("整数2:");scanf("%d", &n2);
if(n1 > n2)
{
max = n1;
min = n2;
}
else
{
max = n2;
min = n1;
}
printf("较大的数是%d。\n", max);
printf("较小的数是%d。\n", min);
return 0;
}
当n1 > n2时, {max = n1; min = n2;}
当n1 < n2时 {max = n2; min = n1;}
像这样用大括号书写在一起的语句称为复合语句或程序块。
复合语句的结构如下,不仅可以包含语句,也可以包含声明,但是一定要把声明放在最开始的位置。
{printf(“ABCDE\n”);} {语句}
{int x; x = 5;} {声明 语句}
{int x; x = 5; printf(“%d”,x);} {声明 语句 语句}
注意
在需要单一语句的位置,如果要使用多个语句可以把它们组合为复合语句(程序块)来实现。用{}括起来的语句会被看为单一语句。
&&称为逻辑与运算符,如a && b可以读作a且b。
||称为逻辑或运算符,如a || b可以读作为a或b。
让我们来看下它们的运算法则:
a | b | a && b |
非0 | 非0 | 1 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
a | b | a || b |
非0 | 非0 | 1 |
非0 | 0 | 1 |
0 | 非0 | 1 |
0 | 0 | 0 |
下面我们用一段程序来划分出一年四季所在的月份:
#include
int main()
{
int month;//月份
printf("请输入月份:");
scanf("%d",&month);
if (month >= 3 && month <= 5)
{
printf("%d是春季。\n", month);
}
else if(month >= 6 && month <= 8)
{
printf("%d是夏季。\n", month);
}
else if(month >= 9 && month <= 12)
{
printf("%d是夏季。\n", month);
}
else if(month ==1|| month == 3 || moth == 3)//千万不要写成(month >= 1|| month <= 3);
{ //后面我们会讲到判断顺序对结果的影响
printf("%d是冬季。\n", month);
}
else
{
printf("%d月不存在。\n", month);
}
return 0;
}
&&运算符在判断a的结果为0时就不会再对b判断,而||运算符则相反,当a的结果不为0时不会对b进行判断。
(month >= 1|| month <= 3);如果这样写的话,当输入的是13时,也会判断为冬季,因为满足了month >= 1,就不会再对month <= 3进行判断了。
在上面我们通过两种逻辑运算符的特点其实已经引出了短路求值的大概方法。
即:仅仅根据左操作数的判断结果就可知逻辑表达式的判断结果的情况下不会对有操作数进行判断,这就是短路求值。
例如:if(n > 0); printf(“值为整数”,n);
在执行语句时,无论n为何值,都显示值为正数。
原因在于,只有一个分号的语句叫做空语句,执行空语句什么都不会发生。
if(n > 0)
;执行空语句,什么都不会发生。
printf(“值为整数”,n); 和if无关的语句,一定会执行。
错误if(n = 0) 此时,a被赋值为0,不管a为何值,该语句都不会被执行。
正确if(n == 0)
错误if(a == b == c) ==是双目运算符,不能实现对三个变量的判断。
正确if(a == b && b == c)
错误if(3 <= a <= 5)
正确if(a >= 3 && a <= 5)
错误if(a >= 3 & a <= 5)
正确if(a >= 3 && a <= 5)
恭喜您,在新的一天又往前迈进了一步!!