二路分支 :if 语句

  • 逻辑: 程序中某一段代码需要满足一定的条件才会被执行
  • 语法:
    • if 语句: 表达一种,如果条件满足则执行某个代码块
    • if-else 语句: 表达一种,如果条件将满足则执行某个代码块否则执行另外一个代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//if 语句:
int a = 100 ;
if ( a > 100 )//判断条件
{
/* 如果满足则执行该代码块 */
printf("啊啊啊!\n");
}


// if ‐ else 语句
if (a < 99 )
{
printf("哦哦哦!!\n");
}
else
{
printf("噢噢噢!!\n");
}


// if‐ esle if ‐ esle if ‐ else
if (a < 99 )
{
printf("啊啊啊!!!\n");
}
else if (a > 99 )
{
printf("哦哦哦!!!\n");
}else
{
printf("噢噢噢!!!\n");
}

注意:
if 语句可以单独使用,但是 else 不可以单独使用,必须在 if 后面配套使用,不管是 if 还是 else ,都建议给他们配一对大括号 { } ,否则需要注意,只能识别 if / esle 后面的第一个逻辑行的语句

1
2
3
4
5
if (a > 1)
printf("Hello\n"); // if的第一个逻辑行,能识别
else
printf("hi\n");// else 的第一个逻辑行,能识别
printf("abc\n"); // 注意此行代码已经不在else的管辖范围内,不能识别

多路分支:switch-case

  • 逻辑: 根据不同的条件来执行不同的代码块
  • 语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
switch (表达式<判断的条件>)
{
case <常量1> :
// 代码块 1
break ;

case <常量2> :
// 代码块 2
break ;

case <常量3> :
// 代码块 3
break ;

default :
// 代码块 N
}

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int num = 0;
printf("请输入数字\n");
scanf("%d", &num);
while (getchar() != '\n'); // 清空标准输入缓冲区

switch (num)
{
case 1:
printf("啊\n");
break;

case 2:
printf("哦\n");
break;

case 3:
printf("噢\n");
break;

default:
printf("咦\n");
}

注意:

  • switch(num )语句中的 num , 它必须是一个整型的表达式,也就是所switch 只能判断整型的数据
  • case 语句中的必须是整型常量,包括普通的字符。不包括被 const 修改的整型数据
  • break 用来中断/跳出当前的循环。如果没有则会从条件满足的语句开始一条一条的往下执行,直到整个switch - case 结束或者遇到其它代码块中的break
  • default 并不是必须存在,它一般放在最后面,用来提示用户表示都不满足以上条件。由于在最后面可以不添加 break

const

用来修饰一个变量使之不可被修改

  • 作用:

    • 修饰变量: 使得变量不能被修改
    • 修饰指针:使得指针的指向不能改变或者指针所指向的内容不得改变
    1
    2
    3
    4
    5
    int const a = 100 ; // 定义了一个不可被修改的变量a
    const int b = 200;

    a = 300 ; // 错误 assignment of read‐only variable ‘a’
    b = 250 ; // 错误 assignment of read‐only variable ‘a’

while 和 do…while 循环

while

逻辑: 使得程序中某一端代码块重复循环执行。
语法:

1
2
3
4
while( 表达式 )
{
// 代码块
}

C-control1

例:

1
2
3
4
while(num) // 非零则真 (布尔值)
{
printf("num:%d\n" , num‐‐ );
}

do … while

语法:

1
2
3
4
do
{
// 代码块
}while(表达式);

C-control2

例:

1
2
3
4
do
{
printf("num:%d\n" , num-- );
} while (num);

注意

  • wehile 循环先进行判断而且条件为真,然后再执行代码块(有可能一次都不执行)
  • do … while 则是先执行一次代码块,然后再判断条件是否成立(最少会执行一次代码块)
  • while(num); --> 空循环这个分号要慎重
  • do… While (num) ; 这个分号不能丢

for 循环

逻辑: 与 while 类似,都是让程序中某一段代码块重复运行,但是 for 相对与 while 来说更加紧凑。把所有的循环控制都集中到一行代码中

语法:

1
2
3
4
for(初始化语句 ; 判断语句 ; 表达式 (一般用于自加/自减))
{
// 代码块
}

例:

1
2
3
4
for (size_t i = 0; i < num ; ++i)
{
printf("i:%ld\n" , i );
}
1
2
3
4
for (;;) // 相当与 while(1)死循环
{
printf("i:%d\n" , i );
}

注意:

  • 初始化语句只会被执行一次
  • 第三个表达式 ++i 再第一次循环的时候并没有被执行
  • 第三个表达式中前缀/后缀并不影响 i 再循环中取值的先后
  • for 循环语句中,三个表达式都可以省略,但是分号必须留下
  • for 循环语句中,三个表达式中间用分号来隔开 ;
  • 在 for 循环中直接定义并初始化只在 C99的编译规则下可以这么干,所以可以添加 -std=c 99 或者 -std=gnu 99

break 与 continue

  • break: 跳出循环结构 / 跳出当前层的循环
  • continue : 结束当前这一次循环,重新进入下一次的循环
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i = 0; i < num; ++i)
{
while (1) // 在循环体内部可以嵌套其它的循环
{
printf("啊!\n");
break; // 跳出while这一层循环, 并不影响外面的for循环
}
if (i == 5)
{
continue; // 跳过当前这一次循环, 导致后面的代码在当次循环中不执行
}
printf("i:%d\n", i);
}

goto 语句

逻辑: 无条件跳转
语法:

1
2
3
4
5
6
7
8
int main(int argc, char const *argv[])
{
标签:
//代码块

goto 标签;
return 0;
}

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(int argc, char const *argv[])
{
int num = 0;
printf("请输入数字\n");
scanf("%d", &num);
while (getchar() != '\n'); // 清空标准输入缓冲区


for (int i = 0; i < num; ++i)
{
goto baioqian; // 无条件跳转到标签为 baioqian 的位置
}

baioqian:
printf("这里是标签的位置!!!\n");
return 0;
}

注意:

  • 标签后面有个冒号 :
  • goto 语句是一个无条件跳转的语句,不利于程序的可读性,一般不建议使用
  • goto 语句一般出现在驱动比较多,用来处理严重的错误,并退出