C语言 第二章-三种控制结构

本文将介绍顺序结构、选择结构和循环结构的运算符、表达式及控制语句。

一、顺序结构

1.算术

(1) 加 +

两数相加

(2) 减 -

两数相减

(3) 乘 *

两数相乘

(4) 除 /

两数相除

整数 / 整数 ,结果会舍去小数部分。例如 5 / 3 的结果为 1 。

但若两数其中有一个是负值,则可能向上取舍也可能向下取舍。

(5) 余 %

求余数

要求两个数都必须为整数

(6) ++i 和 i++

++i 是先自增1,再运算;

i++ 是先运算,再自增1。

假设 i = 5 ,

++i 的值为6 运算后 i=6

i++ 的值为5 运算后 i=6

(7) 优先级和结合性

优先级:乘除余大于加减

结合性:左结合,即自左向右运算

2.赋值

(1) 赋值运算符 =

将右边的值赋给左边的变量。

(2) 复合的赋值运算符

1
2
3
4
5
a+=2; ---- a=a+2;
a-=2; ---- a=a-2;
a*=2; ---- a=a*2;
a/=2; ---- a=a/2;
a%=2; ---- a=a%2;

(3) 结合性

右结合,即自右向左运算 。

(4) 连续赋值

1
a=b=c=1;

赋值运算为右结合,先计算 c=1c=1 会将 1 赋给 c ,并且 c=1 的值也等于 1 。之后继续计算 b=1a=1 ,从而使 a、b、c 三个变量的值都为 1 。

正确写法:

1
2
3
int a,b,c;

a=b=c=1;

错误写法:

1
int a=b=c=1;

(5) 赋值中的类型转换

  • 浮点数赋给整型变量时,舍弃小数部分。

  • 整数赋给浮点型变量时,整数先转换为浮点数形式,再存入。

  • 占用字节多的整数赋给占用字节少的整型变量时,将低字节赋给变量并舍弃其它部分(截断)。

    1
    2
    3
    int i = 289;
    char c;
    c = i;

    此时 i = 33 ,原因如下:

    i —- 00000001 00100001 —- 289

    仅将低字节部分赋给 c ,其它部分被舍弃。

    c —- 00100001 —- 33

二、选择结构

1.关系

优先级:非 > 算术【乘除余>加减】> 关系【大于= 小于 > 等于 = 不等于】> 与和或 > 赋值

注意:

1
3 < num < 4 

应写成

1
3 < num && num <4

2.逻辑

运算符 含义 举例 说明
&& a&&b 仅当a,b同时为真时,结果为真
|| a||b a,b有一个为真,则结果为真
!a 若a真,则结果为假;若a假,则结果为真

a&&b:当 a 为假时,表达式一定为假,不再判断 b

a||b:当 a 为真时,表达式一定为真,不再判断 b

3.条件

1
表达式1 ? 表达式2 : 表达式3

表达式1为真,则执行表达式2,且整个条件表达式的值为表达式2的值;

表达式1为假,则执行表达式3,且整个条件表达式的值为表达式3的值。

4.if

1
2
3
4
5
if(表达式){
语句1;
}else{
语句2;
}

else 总是与最近的 if 配对(除非在不同的代码块内)

5.switch

1
2
3
4
5
6
7
8
9
10
11
switch(表达式){
case 数值1:
语句1;
break;
case 数值2:
语句2;
break;
...
default:
语句n;
}
  • 先计算表达式的结果(表达式结果只能是整数)

  • 假设结果为 n,则执行 case n: 之后的语句

  • 若结果没有对应语句,则执行 default: 之后的语句

  • case n: 仅起指示作用而不起分隔作用,若没有 break ,则会从 case n: 之后一直执行到 switch 结束

三、循环结构

1.while

1
2
3
while(循环条件){
循环体;
}

当循环条件为 时,执行循环体,继续判断循环条件;当循环条件为 时,停止循环。

  • 循环体应该能使循环条件发生改变,否则就会死循环
  • 条件为假时,一次都不执行

2.do while

1
2
3
do{
循环体;
}while(循环条件)

先执行一次循环体;判断循环条件,为 时执行循环体,继续判断循环条件;为 时停止循环。

  • 循环体应该能使循环条件发生改变,否则就会死循环
  • 至少执行一次代码块

3.for

(1) 语法

1
2
3
for(初始语句;循环条件;末尾循环体){
循环体;
}
  • 先执行初始语句,初始语句会且仅会被执行一次
  • 判断循环条件,
    • 当循环条件为 时,执行循环体,执行末尾循环体,继续判断循环条件
    • 判断循环条件,当循环条件为 时,停止循环

(2) 初始语句

  • 一般用于为条件变量赋初值

  • 可省略

    1
    for ( ; i < n; i++)
  • 可包含多个表达式,表达式之间用逗号隔开

    1
    for (i = 0, j = 0;i < n; i++)
  • 可定义变量,C99 允许在初始语句中定义局部变量

    1
    for (int i = 0; i < n; i++)

    (3) 循环条件

循环条件可省略,但不应死循环

例如:

1
2
3
for (i = 0; ; i++){
if(i > n) break;
}

(4) 末尾循环体

  • 一般用于改变条件变量。

  • 可省略,或移动至循环体末尾

    1
    2
    3
    4
    for (i = 0; i < n; ){
    循环体;
    i++;
    }
  • 可包含多个表达式,表达式之间用逗号间隔

    1
    for (i = 0; i < n; i++, j++)

    4.break

用于跳出循环,即跳出整个循环,并继续执行循环之后的语句。

5.continue

用于结束本轮循环,(若是 for 循环,仍会执行末尾循环体),继续执行下一轮循环。

多层嵌套循环时, breakcontinue 只对一层有效

参考