《一站式C编程》读书笔记(6)

第四章 分支语句
4.1 if语句
例:

if(x!=0){
    printf(“x is nonzero.\n”);
}

分析:例子的计算顺序是:先求x!=0这个表达式的值,如果值为0,就跳过{}中的语句直接执行后面的语句,如果值为1,就先执行{}中的语句,然后再执行后面的语句。
上面是if语句的最简单的例子,关于if语句的语法规则如下:

if(控制表达式){
    语句列表
}

还有其他写法,但是另外的写法个人不是很建议,所以就不写出来了。
习题及解答:
1. 以下程序段编译能通过,执行也不出错,但是执行结果不正确,请分析一下哪里错了。还有,既然错了为什么编译能通过呢?

int x =-1;
if(x>0);
printf(“x is positive.\n”);

答:if语句后面带了一个分号;这样在编译器看来if的判断语句已经结束,会运行printf语句。只要将;去掉即可

4.2 if/else语句
语法规则:

if(控制表达式){
    语句列表
}
else {语句列表;}

加入{ }是为了阅读代码方便,如果语句列表里面只有一条语句,{ }就可以省略,但是建议还是用上{ }。If/else语句还可以嵌套使用
例子:

if(x>0){
    printf(“x is positive.\n”);
}
else if (x<0){
        printf(“x is negative.\n”);
    }
    else { printf (“x is zero.\n”);}

习题:
1. 写两个表达式,分别取整形变量的x的个位和十位。
答:取x的个位:int theunit=x%10;
取x的十位:int decade=(x%100-gewei)/10;
2. 写一个函数,参数是整型变量x,功能是打印x的个位和十位。
答:

#include
void prx(int x)
{
  int theunit;
  int decade;
  theunit=x%10;
  decade=(x%100-theunit)/10;
  printf ("the unit of %d is %d\n,decade of % if %d\n",x,theunit,x,decade);
}

int main (void)
{
  prx(15);
  prx(145);
}

4.3 布尔代数
关于逻辑运算的数学体系称为布尔代数(Boolean Algebra)。这章节的内容在其他书本书其实应该是在运算符那一节里面学习的。关于运算符的一些基本知识我用图表表示一下。从别的地方参考来的:

运算符优先级_百度百科
这里面查处一个非常重要的知识:浮点型不适合用==运算符做精确比较。不同平台的浮点数实现由很多不同之处。
下图是全部运算符的优先级:

下面是与,非,或的运算真值表。(很容易记得)

A B A && B
0 0 0
0 1 0
1 0 0
1 1 1

 

A B A||B
0 0 0
0 1 1
1 0 1
1 1 1

 

 

A !A
0 1
1 0

 

习题:
1. 把代码段:

if(x>0&&x<10);
else
    printf(“x is out of range.\n”);

改成下面的这种形式:

if (___||___)
    printf(“x if out of range.\n”);

_______里面改如何填写?
答:if(x<0||x>10)

2. 把代码段:

if(x>0)
  printf(“Test ok!\n”);
else if (x<=0&&y>0)
        printf(“Test Ok!.\n”);
     else printf(“Test failed!\n”);

改写成下面这种形式:

if(______&&_______)
  printf(“Test failed.\n”);
else printf(“Test ok .\n”);

_______里面改怎么填?
答:if(x<=0 && y<=0)

3、有这样一段代码:

if (x > 1 && y != 1) {
    ...
}
else if (x < 1 && y != 1) {
    ...
    }
    else {
        ...
        } 

要进入最后一个else,x和y需要满足条件____ || ____。这里应该怎么填?

答:x==1||y==1

4、以下哪一个if判断条件是多余的可以去掉?这里所谓的“多余”是指,某种情况下如果本来应该打印Test OK!,去掉这个多余条件后仍然打印Test OK!,如果本来应该打印Test failed!,去掉这个多余条件后仍然打印Test failed!。

if (x3)
    printf("Test OK!\n");
else if (x>=3 && y>=3)
        printf("Test OK!\n");
     else if (z>3 && x>=3)
            printf("Test OK!\n");
          else if (z<=3 && y>=3)
                 printf("Test OK!\n");
               else
                 printf("Test failed!\n");

答:改成以下语句即可:

if (y>=3)
  printf("Test OK!\n");
else if (z>3 && x>=3)
        printf("Test OK!\n");
      else if (z<=3 && y>=3)
              printf("Test OK!\n");
           else
              printf("Test failed!\n");

5.下面两段代码是否等价?
代码1:

if(A&&B)
  statement1;
else
  statement2;

代码2:

if(A){
    if(B)
        statement1;
} 
else
    statement2

答:不等价,当A和!B时就不代码1执行statement2,而代码2执行statement1

4.4 switch 语句
switch语句的格式:

switch(控制表达式){
  case 常量表达式:零或多条语句
  case 常量表达式:零或多条语句
  …
  default: 零或多条语句
}

例子:

屏幕快照 2016-07-25 下午3.14.33

如果传入的参数是2,则从case 2 分支开始执行,先是打印相应的信息,然后遇到break语句,它的作用是跳出整个switch语句块。C语言规定各case分支的常量表达式必须互不相同,如果控制表达式不等于任何一个常量表达式,则从default分支开始执行,通常把default分支写在最后,但不是必需的。使用switch语句要注意以下几点:
1. case后面要跟的表达式必须是常量表达式,这个值和全局变量的初始值一样必须在编译时计算出来。
2. case后面必需跟的是整型常量表达式。
3. 进入case后如果没有遇到break语句就会一直往下执行(这称为Fall Through),后面其他case或default分支语句也会被执行到,知道遇到break,或者执行到这个switch语块的末尾。通常每个case后面都要加上break语句。除非有特殊作用,可以不加break。

0 Comments
Leave a Reply