C语言分支和循环(1)

介绍:C语言中有许多结构,其中有顺序结构、选择结构、循环结构。

if,switch:顺序结构

for 、 while 、 do while循环结构

一   

1.if语句

if(语句)

其中,语句为真,继续执行,为假,语句不执行。

在c语言中,表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1)
 printf("%d 是奇数\n", num);
 return 0;
}

注意:if后只默认下一条语句(没有括号的情况下),如果有括号的情况下是包括括号里的所有语句。

例子:

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18)
 printf("成年了\n");
 printf("可以谈恋爱了\n");
 return 0;
}

可以发现无论年龄是否大于18,都会打印(可以谈恋爱了),因为if默认只是自带第一个printf

但是加上大括号可以避免

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18)
 {
 printf("成年了\n");
 printf("可以交⼥朋友了\n");
 }
 return 0;
}

2.else

通常情况下,if和else是连用的

例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印数偶数。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1)
 printf("%d 是奇数\n", num);
 else
 printf("%d 是偶数\n", num);
 return 0;
}

3.if的嵌套

if--else结构中可以继续嵌套if,就如被切成一般的蛋糕可以再切割

⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
 printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
 printf("输⼊的数字是正数\n");
 else
 printf("输⼊的数字是负数\n");

 return 0;
}

有了嵌套if语句,就可以完成更多复杂逻辑的判断。

5.悬空else

else只是匹配最近的if

问:下面结果是啥?

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
 if(b == 2)
 printf("hehe\n");
 else
 printf("haha\n");
 return 0;
}

答案:啥都没有

如果第⼀个 if 语句就不 成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。

如果代码改成下⾯这样就更加容易理解了

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
 {
 if(b == 2)
 printf("hehe\n");
 else
 printf("haha\n");
 }
 return 0;
}

但是,如果我们希望else确实和第⼀个if匹配,可以这样修改代码:

可以这样安排:

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
 {
 if(b == 2)
 printf("hehe\n");
 }
 else
 {
 printf("haha\n");
 }
 return 0;
}

关系操作符

•> ⼤于运算符

• < ⼩于运算符

• >= ⼤于等于运算符

• <= ⼩于等于运算符

• == 相等运算符

• != 不相等运算符

关系表达式通常返回 0 或 1 ,表⽰真假。

C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 , 12 > 20 返回 0 。 关系表达式常⽤于 if 或 while 结构

      注意:相等运算符 == 与赋值运算符 = 是两

1 if (3 == x) ...

个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。

上⾯⽰例中,原意是 x == 3 ,但是不⼩⼼写成 x = 3 。这个式⼦表⽰对变量 x 赋值 3 ,它的返 回值为 3 ,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。

if (x = 3) ...

这样的话,如果把 == 误写成 = ,编译器就会报错。

另⼀个需要避免的错误是:多个关系运算符不宜连⽤。

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岁之间,我们输出⻘年。

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age>=18 && age<=36)
 {
 printf("⻘年\n");
 }
 return 0;
}

3.条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

eg:

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d", &a);
 b = a>5 ? 3:-3;
 printf("%d\n", b);
 return 0;
}

4.逻辑操作符:&& , || , !

• ! :逻辑取反运算符(改变单个表达式的真假)。

• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

5.短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的 结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。

对于 || 操作符是怎么样呢?我们结合前⾯的代码:

if(month == 12 || month==1 || month == 2)

如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。 所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

6.switch

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。 switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重 的 else if 改成更易⽤、可读性更好的形式。

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}

上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值, 就执⾏ default 分⽀。

注意:

• switch 后的 expression 必须是整型表达式

• case 后的值,必须是整形常量表达式

7.while循环

while语句是可以实现循环效果

例如:打印1-10的值

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

利用循环倒序打印:

1. 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4

2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如: n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。

3. 循环1和2两个步骤,在n变成0之前,就能到所有的位

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 while(n)
 {
 printf("%d ", n%10);
 n /= 10;
 }
 return 0;
}

8.for循环

for(表达式1; 表达式2; 表达式3)

表达式1 ⽤于循环变量的初始化

表达式2 ⽤于循环结束条件的判断

表达式3 ⽤于循环变量的调整

9.do while循环

在屏幕上打印1~10的值

#include <stdio.h>
int main()
{
 int i = 1;
 do
 {
 printf("%d ", i);
 i = i + 1;
 }while(i<=10);

 return 0;
}

练习:

输⼊⼀个正整数,计算这个整数是⼏位数?

#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;
}

和求倒序差不多

10.break 和 continue

• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。

• continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所 差异的。

练习:

找出100~200之间的素数,并打印在屏幕上。 注:素数⼜称质数,只能被1和本⾝整除的数字。

1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。

2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤ 循环解决。

3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。

#include <stdio.h>
int main()
{
 int i = 0;
 //循环产⽣100~200的数字
 for(i=100; i<=200; i++)
 {
 //判断i是否为素数
 //循环产⽣2~i-1之间的数字
 int j = 0;
 int flag = 1;//假设i是素数
 for(j=2; j<i; j++)
 {
 if(i % j == 0)
 {
 flag = 0;
 break;

 }
 }
 if(flag == 1)
 printf("%d ", i);
 }
 return 0;
}

11. goto语句

goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。

goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。

for(...)
{
 for(...)
 {
 for(...)
 {
 if(disaster)
 goto error;
 }
 }
}
error:
 //...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值