C语言程序有三种结构:顺序结构、选择结构、循环结构。
选择结构
C语言通过关系运算和逻辑运算构造选择判断的条件。
1.关系运算符>,>=,<,<=,==,!=
关系表达式的值反映关系成立与否,用0表示不成立(假),用1表示成立(真)。关系表达式的值为int型。C语言中用int型记录逻辑结果。
2.逻辑运算符&&、||、!
&& 与:一假则假,为双目运算,格式:表达式1&&表达式2
|| 或:一真则真,为双目运算,格式:表达式1||表达式2,优先级比&&低
!非:真假相对,单目运算
系统如何判断真假?
在C语言中,任何等于零的东西都被认为是假,任何等于非零值的东西都被认为是真,因此,最常见的定义就是假为0,真为1。
&&和||都具有截断特性,即&&运算时先算表达式1,由于它的运算规则为一假则假,若表达式1为假,则直接判断为假,无法继续计算表达式2。同理进行||运算时,若表达式1为真,则直接判断为真,表达式2不计算。对于这一特性,可以修改、运行下面代码的来进行理解。
int a=0,b=1;
//b = a++ && a>0;
//b = a<0 && a++;
//b = a<0 && ++a;
//b = a<0 || ++a;//b = (a<0)&&(++a)
b = a>0 || ++a;
printf("a = %d = %d\n",a,b);
3.选择语句
3.1if语句
if 语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
if语句的基本格式:
单分支:
if(表达式){
语句;...
}
双分支:
if (表达式) {
语句;...
}else
{
语句;...
}
多分支:
if(表达式){
语句;
}
else if (表达式) {
语句:
}
else if
{
语句;
}
else{语句;}
单分支,用于判断一种情况,执行过程流程图见下图a;双分支,判断两种情况,注意else后不能接表达式。多分支用于判读多种情况。多分支使用时要注意尽量做到只判断一件事的不同情况,不要与其他事件混合
简单应用:下面的例子是用if语句完成输入一个月份,判断该月有多少天。
#include <stdio.h>
int main(void)
{
int year,month,days;
printf("Input year and month: ");
scanf("%d%d",&year,&month);
if(month<1||month>12)
{
printf("incorrect month!\n");
return -1;
}
if(month==4||month==6||month==9||month==11)
{
days = 30;
}
else if(month==2)
{
if(year%4==0&&year%100!=0 || year%400==0)
{
days = 29;
}
else
{
days = 28;
}
}
else
{
days = 31;
}
printf("days = %d\n",days);
return 0;
}
运行结果
Input year and month: 2024 2
days = 29
3.2条件运算符
条件运算符(? : )是一个三目运算符,即有三个操作数。
使用条件运算符(?:)可以实现 If else 的功能,其一般形式为:
表达式1 ? 表达式2 : 表达式3
其意思是:如果表达式1为真,则运算表达式2,整个条件表达式的值为 表达式2的值;反之,则运算表达式3,整个条件表达式的值为表达式3的值。
注意:条件运算符的优先级比赋值运算高,在表达式中用到赋值运算时要将赋值运算括起来。
简单应用:用输入三个数,用条件运算符找出最大值并输出最大值。
#include <stdio.h>
int main (void)
{
int a,b,c,max;
printf("Input 3 num: ");
scanf("%d%d%d",&a,&b,&c);
max = a>b?a:b; //a>b?(max=a):(max=b);
max = max>c?max:c;
printf("max = %d\n",max);
return 0;
}
运行结果
Input 3 num: 5 6 7
max = 7
3.3switch
switch 语句是多分支选择语句。
基本格式:
switch(表达式)
{
case 常量1:语句1;break;
case 常量2:语句2;break;
...
default:语句n
break;
}
注意:
1.switch后面的表达式必须是一个整型
2.case后面的常量表达式必须是常量不能是变量
3.case、default都是标签
4.default不一定要放在最后
简单应用:要求按照考试成绩的等级输出百分制分数段。
#include <stdio.h>
int main(void)
{
char grade;
scanf("%c",&grade);
switch(grade)
{
case 'A':printf("85~100");break;
case 'B':printf("70~84");break;
case 'C':printf("60~69");break;
case 'D':printf("<60");break;
default:printf("error");break;
}
printf("\n");
return 0;
}
运行结果
A
85~100
循环控制:
1.goto
goto 标签; 跳转语句
goto语句构成循环需要有循环体、结束条件、使循环趋于结束的条件、循环的初始条件。
2.while
while用来实现“当型”循环
基本结构
while(表达式)
{
语句;
}
流程图
当表达式为非0时,执行语句,执行完成后再次判断,直到表达式为0,结束while。
简单应用:求1+2+3+...+100的值。
#include <stdio.h>
int main(void)
{
int sum=0,i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("sum = %d\n",sum);
return 0;
}
运行结果
sum = 5050
总结:
1.C语言的关系运算与数学上的比较含义不同,例如int a=1;0<a<5。计算时先将前面结合,算出值后再与后面比较。(0 <a)<5,0<a得到1,1<5.
2.逻辑运算的短路特性和截断特性:这个特性会影响表达式2是否还要计算,影响后面的值,要特别关注。
3.switch与if的区别:
if 语句:对条件进行判断,是否满足,根据判定的结果(真或假)执行相应的语句。
switch语句:先计算表达式的值,然后跳转到case的标签值与表达式值相等的地方开始往下执行,如果没有跳转指令的话会一直往下执行直到switch语句的最后,在语句序列加入break后可直接跳出switch语句。
if语句只能从两者中选择一个,当要实现几种可能之一时,就要用if...else if,甚至多重的嵌套if来实现,当分支较多时,程序会变得复杂,可读性较差,swtich...case语句专门处理多分支的情形,使程序变得简洁。
注意:switch语句中的表达式必须是整型或者字符型,对表达式求得的值不能是任何变量。而if语句对给定的条件进行判断是否满足,规则为零值代表假,非零值代表真。所以if语句受用的范围更为广泛。