使用关系表达式最多的是if 或 while 语句,例如:
if (x == 3 )
{
printf ( "x is 3.\n" );
}
注意: 相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写出下⾯的代码,写错的代码可以运⾏,但很容易出现意料之外的结果。
if (x = 3 )
上面if语句的 原意是 x == 3 ,但是不⼩⼼写成 x = 3 。这个式⼦表⽰对变量 x 赋值 3 ,它的返 回值为 3 ,所以 if 判断总是为真。为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边,即 if ( 3 == x) ,这样写错的时候编译器会报错。
另⼀个需要避免的错误是:多个关系运算符不宜连⽤。如: i < j < k , 连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是 (i < j) < k 。 i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤ i < j && j < k 这种写法。
⽐如:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。如果我们按照上面的错误讲解写,代码展示为:
cpp复制代码
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(18<=age<=36)
{
printf("⻘年\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
这道题可以帮助各位锻炼一下上面讲的知识点,在这里不再细讲,如果还有什么疑问的话,欢迎大家私信我。
# switch 语句
switch语句是除if语句之外的第二类分支结构语句。本质上讲,switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。形式为:
switch (expression) {
case value1: statement
case value2: statement
default : statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。在这要注意:
• switch 后的 expression 必须是整型表达式。
• case 后的值,必须是整形常量表达式。
1 if语句和switch语句的对⽐
练习:输⼊任意⼀个整数值,计算除3之后的余数
如果使⽤if语句完成,如下:
cpp复制代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
而如果使⽤switch语句改写,就可以是这样的:
cpp复制代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述的代码中,我们要注意的点有:
case 和后边的数字之间必须有空格。
每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。
2 switch语句中的break
前⾯的代码中,如果我们去掉case语句中的break,会出现什么情况呢?
cpp复制代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
printf("星期⼀\n");
break;
case 2:
printf("星期⼆\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("⼯作⽇\n");
break;
case 6:
case 7:
printf("休息⽇\n");
break;
}
return 0;
}
在使用switch语句的时候,我们经常可能遇到一种情况,比如switch后的表达式中值无法匹配代码中的case语句时,这时候要不就不做处理,要不就得在switch语句中加入default子句。说白了,default的作用就是在case中没有对应分支语句时,default会承担case的责任,并继续执行下方语句。其结构是:
switch (expression)
{
case value1:
statement;
case value2:
statement;
default :
statement;
}
如果switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏
default ⼦句。 就⽐如前⾯做的打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可 以这样完成代码:
cpp复制代码
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("⼯作⽇\n");
break;
case 6:
case 7:
printf("休息⽇\n");
break;
default:
printf("输⼊错误\n");
break;
}
return 0;
}
4 switch语句中的case和default的顺序问题
在 switch 语句中 case ⼦句和 default ⼦句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。
# while循环
C语⾔一共提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。while 语句的语法结构和 if 语句⾮常相似。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
4 while循环和for循环的对⽐
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些。
5 for循环练习
练习1: 计算1~100之间3的倍数的数字之和
cpp复制代码
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=1; i<=100; i++)
{
if(i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
这是最常见的写法,但是如果能直接产⽣3的倍数的数字就省去了多余的循环和判断,思路有了就要立即实践。
cpp复制代码
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=3; i<=100; i+=3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
' 这样不仅简化了代码,还提高了运行效率,这也是我们在平常刷题的时候要去不断思考得到问题。
# do---while循环
1 语法形式
在循环语句中 do while 语句的使⽤最少,它的语法如下:
do
{
语句;
}
while ( 表达式 ) ;
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环; ⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
2 do while循环的执行流程
在 do while 循环中先执⾏图上的"循环体",执⾏完后,在去执⾏"条件",条件的结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。
3 do while循环的实例
在屏幕上打印1~10的值
cpp复制代码
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。
4 练习
输⼊⼀个正整数,计算这个整数是⼏位数?
例如: 输⼊:1234 输出:4
输⼊:12 输出:2
cpp复制代码
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
这⾥并⾮必须使⽤do while 语句,但是这个代码就⽐较适合使⽤ do while循环,因为当n是0时,while和for循环打印都是0,而do while是1。