C控制语句:分支和跳转

if语句:

if语句被称为分支语句选择语句,因为它提供了一个交汇点,在此处程序需要选择两条分支中的一条前进。一般的形式如下:

<span style="font-size:18px;">if (expression)
      statement</span>
如果 expression 求得的值为真(非零),就执行 statement;否则,跳过该语句。

和 while 循环一样, statement 既可以是单个语句也可以是一个代码块(术语上称为复合语句)。这种结构和 while 语句很相似。主要的区别在于在 if 语句中,判断和执行(如果可能的话)仅有一次,而在 while 循环中,判断和执行可以重复多次

通常,expression 是一个关系表达式。也就是说,它比较两个量的大小,像表达式 x>y 和 c== 6 那样。如果 expression 的值为真 (x大于y,或者c等于6);就执行语句;否则,将忽略语句。更一般地,可以使用任何表达式,表达式的值为 0 就被视为假。语句部分可以是一个简单语句,就像例子中的那样;也可以是一个由花括号标出的复合语句(代码块):

<span style="font-size:18px;">if (score > big )
    printf ("Jackpot \n");   // 简单语句
    if (joe > ron )          // 复合语句
    {
       jackpot++
       printf ("you lose,Ron \n"); 
     }
</span>
注意:即使if中使用了一个复合语句,整个if结构仍将被看作一个简单语句。

if else 语句的通用形式为:

<span style="font-size:18px;">if (expression)
      statement1
    else
       statement2</span>
如果 expression 为真(非零),就执行 statement1;如果 expression 为假或零,则执行跟在 else 后的那一条语句 (statement2)。语句可以是简单的或复合的。C 不要求缩排,但这是标准的风格。缩排使语句依赖于判断而执行这一事实显得一目了然。

如果希望在 if 和 else 之间有多条语句,必须使用花括号创建一个代码块。

getchar( )和putchar( ):

专门为面向字符 I/O 而设计的一对 C 函数: getchar( )和 putchar( )。


getchar( )函数没有参数,它返回来自输入设备的下一个字符

ch = getcahr( ) 与 scanf("%c",&ch); 等效。

因为这些函数仅仅处理字符,所以它们比更通用的 scanf()和 printf()函数更快而且更简洁。同样,注意到它们不需要格式说明符,因为它们只对字符起作用。这两个函数通常都在 stdio.h 文件中定义(而且,它们通常只是预处理器宏,而不是真正的函数。


ctype.h系列字符函数:

ctype.h是C标准函数库中的头文件,定义了一批C语言字符分类函数,用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节(Byte)字符,也支持宽字符。


多重选择else if:

else的一般形式:

<span style="font-size:18px;">if (exprssion1)
     statement1
   else if(exprssion2)
     statement2
   else
     statement3</span>

实际上,else if 是已经学过的形式的一种变化。也就是说,程序所包含的一个 if else 语句是另一个 if else 语句的 else 语句部分。我们称第二个 if else 语句被嵌套在第一个里面。回忆一下,整个 if else 结构作为一条语句,这就是为什么不必将被嵌套的 if else 放在花括号中。然而使用花括号可以更清楚地表明这种特殊格式的含义。

两种形式完全等价。唯一的区别在于空格和换行的使用位置,而编译器会忽略这些差别。


当有众多 if 和 else 的时候,计算机是怎样判断哪个 if 对应 哪个 else 的?

规则:如果没有花括号指明, else 与和它最接近的一个 if 相匹配。


逻辑运算符:


逻辑运算符通常使用关系表达式作为操作数。! 运算符带一个操作数。 其他两个逻辑运算符带有两个操作数:一个在左边,一个在右边。

逻辑运算符的优先级低于关系运算符。

逻辑表达式:

当且仅当两个表达式都为真时,expression1 && expression2 为真。 如果其中一个为真或两个表达式都为真, expression1 || expression2 为真。 如果 expression 为假,则 !expression 为真,反之亦然。

求值顺序:

逻辑表达式是从左到右求值的。一旦发现有使表达式为假的因素,立即停止求值。


条件运算符?:

C 提供一种简写方式来表示 if else 语句的一种形式。这被称为条件表达式,并使用条件运算符(?:)。这是个有三个操作数的分两部分的运算符。

有一个操作数的运算符称为一元运算符,有两个操作数的运算符称为二元运算符。按照该惯例,有三个操作数的运算符就应该称为三元运算符条件运算符就是 C 的该类型的唯一的一个例子

条件表达式的一般形式:

<span style="font-size:18px;">expression1 ? expression2 : expression3</span>
如果 expression1 为真(非零),整个条件表达式的值和 expression2 的值相同。如果expression1 为假(零),整个条件表达式的值等于 expression3 的值。

当希望将两个可能的值中的一个赋给时,可以使用条件表达式。典型的例子是将两个值中最大的值赋给变量:

<span style="font-size:18px;"> max = (a > b) ? a: b;  (如果 a 大于 b 那么 max 等于 a ,否则等于 b)
</span>

通常,if else 语句能完成与条件运算符同样的功能。但是,条件运算符语句更简洁;并且,依赖编译器,可以产生更精简的程序代码。


循环辅助手段:continue和break

一般说来,进入循环体以后,在下次循环判断之前程序执行循环体中所有的语句。continue 和 break 语句使你可以根据循环体内进行的判断结果来忽略部分循环甚至终止它。

continue语句:

该语句可以用于三种循环形式。当运行到该语句时,它将导致剩余的迭代部分被忽略,开始下一次迭代。如果 continue 语句处于嵌套结构中,那么它仅仅影响包含它的最里层的结构。

break语句:

循环中的 break 语句导致程序终止包含它的循环,并进行程序的下一阶段。下图比较了 continue 和 break ,如果 break 语句位于嵌套循环里,它只影响包含它的最里层的循环


break和continue的区别:

break是结束整个循环体,continue是结束单次循环。

<span style="font-size:18px;">for (i=0;i<10;i++)
{
if (i==6) continue;/*如果i==6则不再执行下面的if语句,而是直接进行下一轮循环*/
if (i==7) break;/*如果i==7,则不再执行剩余的循环,直接退出for循环去执行下面的printf();*/
}

printf("break");</span>

多重选择:switch和break

switch 语句使你能够从一系列以整数值为标签的语句中进行选择。如果紧跟在 switch 关键字后的判断条件的整数值与某标签相匹配,执行就定位到由该标签定位的语句。然后执行继续完成紧跟在该标签语句后的语句,直到遇到一个 break 语句。

break 语句有什么作用呢?它导致程序脱离 switch 语句,跳到 switch 之后的下一条语句。如果没有 break 语句,从相匹配的标签到 switch 末尾的每一条语句都被处理。

break 语句用于循环和 switch 中,而 continue 仅用于循环。但是,如果 switch 语句位于一个循环中,则可以把 continue 用于 switch 语句的一部分。在这种情况下,就像在其他的循环中一样,continue 导致程序跳过该循环的其余部分,其中包括 switch 的其余部分。

 圆括号中的 switch 判断表达式应该具有整数值(包括 char 类型)case 标签必须是整型(包括 char)常量或者整数常量表达式(仅包含整数常量的表达式)。不能用变量作为 case 标签。因而,switch 结构是这样的:

<span style="font-size:18px;">switch (integer expression)
     {
        case constant1:
           statements    --  可选
        case constant2:
           statements    --  可选
        default:
           statements    --  可选
     }
</span>
default表示除了上面的情况外的所有情况。

总结:程序控制按照 expression 的值跳转到相应的 case 标签处。然后程序流程继续通过所有剩余的语句,直到再次由 break 语句重定向。 expression 和 case 标签必须都是整型值(包括类型 char ),那么控制定位到标签为 default的语句,如果它存在的话。否则,控制传递给紧跟着 switch 语句的下一条语句。

格式:

<span style="font-size:18px;"> switch (expression)
   {
      case label1: statement1 // 使用 break 跳至 结尾处
      case label2:statement2
      default: statement3
   }</span>
可以存在两以上的标签语句,并且 default 语句是可选的。

例如:

<span style="font-size:18px;"> switch (choice) 
    {
       case 1:
       case 2: printf (" Darn tootin \n");
       case 3: printf ("Quite right \n");
       case 4: printf (" Good show \n");
       default: printf ("Have a nice day \n");
     }</span>
如果 choice 为整型值 1 或 2,则打印第一条消息。如果它的值为 3,则打印第二条和第三条消息(因为在 case 3 后没有 break 语句,所以流程继续到随后的语句)。如果它的值为 4,则打印第三条消息。对于其他值,仅打印最后一条消息。


goto语句:

goto 语句包括两个部分:goto 和一个标签名称。标签的命名遵循与命名变量相同的约定,如下例所示:

<span style="font-size:18px;">goto part2;</span>
为使上述语句工作,函数必须包含由 part2 标签定位的其他语句。这可以通过以标签名紧跟一个冒号来开始一条语句完成:

<span style="font-size:18px;">part2: printf ("Refined analysis: \n");</span>
原则上,C 程序根本不需要使用 goto 语句。

goto 语句导致程序控制跳转到由指定标签定位的语句。冒号用来将被标记的语句同它的标签相分隔。标签名遵循变量的命名规则。被标记的语句可以出现在 goto 之前或之后。
格式:

<span style="font-size:18px;">goto label:
      .
      .
      .
label;statement</span>
例如:

<span style="font-size:18px;">top: ch =getcahr();
        .
        .
        .
     if (ch != 'y');
          goto top;</span>


break 、continue 和 goto 是跳转语句,导致程序流程跳转到程序的其他位置。break 语句导致程序跳转到紧跟在包含它的循环或 switch 末尾的下一条语句。continue 语句导致程序跳过包含它的循环的剩余部分,开始下一下循环周期。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值