在前面介绍过,C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环2结构。C语言是能够实现上述的三种结构的。
C语言中可以是用if语句和switch语句来实现选择结构(分支结构),用while语句,for语句以及do while语句来实现循环结构。
if语句:
语法:第一行if(表达式),第二行加上语句。
其中表达式成立(为真),则执行语句,表达式不成立(为假),则语句不执行。在C语言中,0为假,非0为真,也就是表达式的结果为非0,语句执行。表达式的结果为0,语句不执行。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num%2==1)
{
printf("奇数");
}
return 0;
}
上面的代码可以判断输入的一个整数是否为奇数,但不能打印出偶数。所以我们可以借助else来提示出偶数。毕竟一个整数只有奇数和偶数之分。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num)
if(num%2==1)
{
printf("奇数")
}
else
{
printf("偶数")
}
return 0;
}
这就使奇数和偶数都打印了出来,让if..........else语句得到了使用。
嵌套if:
如果有多种情况该怎么办呢?这就需要我们在if........else语句中的else中继续嵌套if语句了!从而构成多重判断。
比如输入一个整数,判断这个整数是0,正数,还是负数。代码如下:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num>0)
{
printf("正数");
}
else
{
if(num ==0)
{
printf("0");
}
else
{
printf("负数");
}
}
return 0;
}
使用if嵌套,就实现了多种可能,当然这里是可以将if的嵌套给简化,可以将else里的嵌套if 直接去掉大括号,改成else if即可,代码如下:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num>0)
{
printf("正数"};
}
else if(num==0)
{
printf("0");
}
else
{
printf("负数");
}
return 0;
}
在else中还有一个问题就是悬空的else:
如果多个if 和else,可以记住这样一条规则。else总是跟最接近的if相匹配。当然,只要我们能在写代码时,加入适当的大括号。代码的逻辑就关系操作符:
C语言用于比较的表达式,称为"关系表达式",里面使用的运算符就称为"关系运算符"如下:
>大于运算符 <小于运算符
>=大于等于运算符
<=小于等于运算符
==相等运算符
!=不相等运算符
关于表达式通常返回0或1,表示真假。
C语言中,0表示假,所有非零值表示真。比如:20>12返回1,12>20返回0。
关系表达式常用于if和while结构。
注意:相等运算符==与赋值运算符=是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。会变得更为清晰,可以让代码的可读性更强。
另一个需要避免的错误是:多个关系运算符不宜连用。
1 i<j<k
上面的示例中,连续使用两个小于运算符。这是合法的表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
1 (i<j)<k
上面式子中,i<j返回0或1,最终是0或1与变量k比较。如果想要判断变量j的值是否在i与k之间,应该使用下面的写法。
1 i<j && j<k
条件操作符:
条件操作符又是三目操作符。语法如下:
esp1 ? esp2:esp3
条件操作符的运算逻辑是,如果esp1的结果为真,计算esp2的表达式,作为整个计算的结果。如果esp1的结果为假,计算esp3的结果,作为整个计算的结果。
条件操作符可以简化一些if语句,例如:
#include<stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);
if(num1>5)
{
num2 = 3;
}
else
{
num2 = 2;
}
printf("%d",num2);
return 0;
}
可以将这个代码用条件操作符来简化。如下:
#include<stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d",&num1,&num2);
num1>5?num2=3:num2=2;
printf("%d",num2);
return 0;
}
逻辑操作符:&&,‖,!
逻辑运算符提供判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
!:逻辑取反运算符(改变单个表达式的真假)。
&&:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
‖:或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
注:C语言中,非0表示真,0表示假。
短路:
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为"短路"。
如:
1 if(month >=3 && month <=5)
表达式中&&的左操作数是month >=3,右操作数是month <=5,当左操作数month >=3的结果为0的时候,即使不判断month <=5,整个表达式也是0。
所以对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
对于‖操作符来说,左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
switch语句:
除了if语句外,C语言还提供了switch语句来实现分支结构。
switch语句是一种特殊形式的if……else结构,用于判断条件有多个结果的情况。它把多重的else if 改成更易用、可读性更好的形式。
语法如下:
switch(expression)
{
case value1:statement
break;
case value2:statement
break;
default:statement
break;
}
上面代码中,根据表达式expression不同的值,执行相应是case分支。如果找不到对应的值,就执行default分支。在运行是,分支从break中跳出。
注:switch后的expression必须是整型表达式。
case后面的值,必须是整型常量表达式。
输入一个任意整数值,计算除3之后的余数:(我们将if语句和switch语句进行对比)
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if (num%3==0)
{
printf("余数为0。");
}
else if(num%3==1)
{
printf("余数为1。");
}
else
{
printf("余数为1")
}
return 0;
}
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
swicth(num%3)
{
case 0:
printf("余数为0");
break;
case 1:
printf("余数为1");
break;
case 2:
printf("余数为2");
break;
}
return 0;
}
switch 语句也是分支效果的,只有在 switch 语句中使用break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
switch语句中的case和default的顺序问题
其实,在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常把default的句子放在最后处理。
while循环:
while语句的语法和if语句非常相似。
while(表达式)
语句;如果循环体想包含更多的语句,可以加上大括号。
for循环
for循环是三种循环中使用最多的,for循环的语法如下:
for(表达式1;表达式2;表达式3)
语句;
表达式1:用于循环变量的初始化。
表达式2:用于循环结束的条件的判断。
表达式3:用于循环变量的调整下面。
下面是利用for循环的例子,打印1-100里的整数,并且求出是3倍数的整数的和。
#include<sdtio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=1;i<=100;i++)
{
printf("%d\n",i);
if(i%3==0)
{
sum += i;
}
}
printf("%d\n",sum);
return 0;
}