C语言再学习 -- 分支与跳转语句

来源:互联网 发布:net4.0是什么软件 编辑:程序博客网 时间:2024/06/14 03:39

一、if语句

形式1:

if (逻辑表达式)

执行语句

如果逻辑表达式为真,则执行执行语句

形式2:

if (逻辑表达式)

执行语句1

else

执行语句2

如果逻辑表示是为真则执行执行语句1,否则执行执行语句2

形式3:

if (逻辑表达式1)

执行语句1

else if (逻辑表达式2)

执行语句2

else

执行语句3

如果逻辑表达式1为真,则自行执行语句1,如果逻辑表达式1为假而逻辑表达式2为真,则执行执行语句2,否则,如果两个表达式都为假,执行执行语句3


关于if语句形式2分析:

规则是如果没有花括号致命,else与和它最近的一个if相匹配。如果希望在if和else之间有多条语句,必须使用花括号创建一个代码块。下面的结构违反了C语法,因为编译器期望if和else之间只有一条语句。

if (x >0)printf ("x = \n");x++;elseprintf ("x <= 0");

编译器会把printf()语句看作if语句的部分,将x++语句看作一条单独的语句,而不把它作为if语句的一部分。然后会认为else没有所属的if,这是个错误,应该使用花括号。或者参看do while (0)语句。

if (x >0){printf ("x = \n");x++;}elseprintf ("x <= 0");

判断条件通常是一个关系表达式,也就是用一个关系运算符构成的表达式,例如:< 或者 ==。利用C的逻辑运算符,可以作何多个关系表达式以创建更复杂的判断。

需要注意的几点:

1、赋值运算符和逻辑运算符

例如:

if (5 = n)    语法错误

if (5 == n)  检查n的值是否为5

2、  if(n != 0)可用if (n)代替

3、if (n >= 9 && n <= 100) 不要写成 if (90 <= n <= 100)

问题在于该代码是语义错误,我不是语法错误,因为对于<=运算符的求值顺序是由左到右的,所以会把该测试表达式解释为如下形式:

(90 <= n)  <= 100

子表达式90 <= n的值为1(真)或0(假)。任何一个值都小于100,因此不管n的值是什么,整个表达式总是为真,所以需要使用&&来检查范围。

例如:  if (5 > 2 > 3) 布尔值为0(假).


注意: 零值表示“假”,非零值表示“真”,负数也是非零值。

#include <stdio.h>  int main (void)  {  if (-1){printf ("111111111\n");}printf ("222222222\n");return 0;  }  输出结果:111111111222222222

二、循环辅助手段:continue和break

1、continue语句

continue命令可以与三种循环形式中的任何一种一起作用,但是不能喝switch语句一起使用。他导致程序控制跳过循环中的剩余语句。对于while和for循环,开始下一个循环周期。对于do while循环,对退出条件进行判断,如果必要,开始下一个循环周期。

用处:可以在主语语句中消除一级缩排。当语句很长或者已经有很深的嵌套时,作为占位符,使代码根据可读性:

while (getchar () != '\n')

continue;

2、break语句

循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段。break命令可以与三种循环形式中的任何一种以及switch语句一起使用。它导致程序控制跳过包含它的循环或switch语句的剩余部分,继续执行紧跟在循环或switch后的下一条命令。

break语句实质上是switch语句的附属物,顺便提一下,break语句用于循环和switch中,而continue仅用于循环。

例如:在if语句中使用continue会出现: 错误:continue语句出现在循环以外。


三、多重选择:switch和break


以上面的例子来说明switch语句:

如果i为整形值1或者2,则打印22222。如果它的值为3,则打印33333和44444(因为杂case 3后没有break语句,所以流程继续到随后的语句),如果它的值为4,则打印44444,。对于其他值,仅打印hello world

#include <stdio.h>int main (void){int i = 0;scanf ("%d", &i);switch (i){case 1:// printf ("11111\n");// break;case 2:printf ("22222\n");break;case 3:printf ("33333\n");// break;case 4:printf ("44444\n");break;default:printf ("hello world\n");break;}return 0;}

//示例switch (enSize){   case PIC_QCIF:        stH264Cbr.u32BitRate = 256; /* average bit rate */        break;   case PIC_QVGA:    /* 320 * 240 */   case PIC_CIF:         stH264Cbr.u32BitRate = 512;        break;   case PIC_D1:   case PIC_VGA:   /* 640 * 480 */        stH264Cbr.u32BitRate = 1024*2;        break;   case PIC_HD720:   /* 1280 * 720 */        stH264Cbr.u32BitRate = 1024*2;        break;   case PIC_HD1080:  /* 1920 * 1080 */        stH264Cbr.u32BitRate = 1024*4;        break;   case PIC_5M:  /* 2592 * 1944 */        stH264Cbr.u32BitRate = 1024*8;        break;                          default :        stH264Cbr.u32BitRate = 1024*4;        break;}

总体注解:

程序控制按照逻辑表达式的值跳转到相应的case标签处。然后程序流程继续通过所有剩余的语句,直达再次由break语句重定向。逻辑表达式和case标签必须都是整型值(包括类型char),并且标签必须是常量或者完全有常量组成的表达式。如果没有表达式值相匹配的case标签,那么控制定位到标签为default的语句,如果它存在的话。否则,控制传递给紧跟着switch语句的下一条语句。

每个 switch 语句中只能出现一条 default 子句。但是,它可以出现在语句列表的任何位置,而且语句流会像贯穿一个 case 标签一样贯穿 default 子句。

四、goto语句

不要轻易使用

可以了解一下:

while(1)、for( ; ; )、goto这三者可作为死循环 

0 0
原创粉丝点击