结构化程序设计里有三种程序结构,分别是顺序结构,分支结构,循环结构。goto语句不属于结构化程序设计范畴,但在某些情况也会使用。

顺序结构

指代码从前往后,从上往下顺序执行,之前遇到的所有程序都是顺序结构。

分支语句

指代码会根据不同的条件来选择不同的分支执行,C语言支持if语句和switch...case语句的分支结构。

if语句

也称为判断语句,一共有下面三种形式:

// 如果条件成立,则执行语句块
if(判断条件)
{
    语句块;
}
// 如果条件成立,则执行语句块1,
// 否则执行语句块2
if(判断条件)
{
    语句块1;
}
else
{
    语句块2;
}
// 如果条件1成立,则执行语句块1,
// 如果条件2成立,则执行条件2,以此类推,
// 如果都不成立,则执行默认语句块
if(条件1)
{
    语句块1;
}
else if(条件2)
{
    语句块2;
}
...
else
{
    默认语句块;
}

if语句可以嵌套,也就是在一个if语句的语句块中再嵌套一个if语句。

使用if语句的注意事项:

  1. 如果if语句的某个语句块只有一条语句,那么可以省略这个语句块的大括号,如下:

    if(a > b)
        printf("a > b");
    else
        printf("a <= b");
  2. if语句的判断条件,只要计算出来的结果是非0,那么条件就成立。计算的方式可以是函数调用或是任何运算符所构成的表达式,像下方式都是合理的:

    if(0) { ... }
    if(1) { ... }
    if(a = 3} { ... }
    if(a == 3) { ... }
    if(scanf("%d %d %d", &a, &b, &c)) { ... }
  3. 注意判断条件中赋值与相等的区别,赋值是 "=",判断相等是 "=="。 谨慎的做法是,在相等判断的时候,把常量写在前面,比如 "3 == a",这样,即使错写成 "3 = a",编译器也能检查出错误,避免程序出现逻辑错误。
  4. if与else的配对原则:从最内层开始,else总是与它上面最接近的、未曾配对的if匹配。
  5. 避免if与else配对错位的最佳方法是使用括号和缩进,良好的编程习惯是即使if或者else的语句只有一条,也要另起一行加上括号和缩进。

switch语句

switch(表达式1)
{
case 常量表达式1:
     语句1;
     break;
case 常量表达式2:
     语句2;
     break;
...
case 常量表达式n:
     语句n;
     break;
default:
     默认语句;
     break;
}

使用switch语句的注意事项:

  1. switch后面的表达式计算结果必须为int型或char型,浮点型与地址类型及其他构造类型都是不合法的。
  2. case后面必须为可以精确进行比较的int型或char型常量或常量表达式,使用变量表达式是不合法的。
  3. case后面的常量表达式必须的互不相同,否则编译无法通过。
  4. 每个case的结尾绝对不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。
  5. case与default的出现顺序不影响执行结果。
  6. 必须使用default分支,即便程序不需要default,也应该保留default语句并加上break。保留的目标是让程序来解释,编程者已经考虑到了default情况并认为可以不加处理,从而避免让人误以为你忘了default处理。

if语句与switch语句的比较

理论上,使用switch的语句都可以用if语句来改写,但是,在纯粹进行数字或字符比较且比较的分支较多时,使用switch语句的代码逻辑性和可读性都要优于if语句,自行体会。

循环结构


goto

  • 无标签