c语言入门6,掌握它,世界上还有解决不了的问题吗?if分支语句

到目前为止,我们举的 c 语言程序例子都是顺序执行的,都是从 main 函数开始,一条一条按顺序执行的。但是,现实中的问题可不一定都是这么简单的,例如,给定一个数,如果是 0 就打印 zero,否则打印 nonzero。要解决这个问题,只使用顺序式语句就很难解决了。

事实上,C 语言提供了一些分支语句语法,再来分析一下上述问题:给定一个数,【如果】是 0,就打印 zero,【否则】就打印 nonzero,用伪代码来写这个问题就是:

一个数;
如果 一个数 不等于 0
    打印 nonzero
否则
    打印 zero

C 语言作为高级语言,设计的时候就应该贴合人类的使用,实际上,C 语言解决这个问题,语句风格和上面的伪代码风格非常一致,请看:

int a = 3;
if(a != 0){
    printf("nonzero\n");
}else{
    printf("zero\n");
}

以上就是 C 语言的 if 语句,只不过我们要把判断条件“a!=0”用括号括起来。C 语言的关系运算符和数学中的略有差异,请看下图:

if 的中文意思是“如果”,else 的中文意思是“否则”。

应注意:

  • 这里的==表示数学中的相等关系,相当于数学中的=号,初学者常犯的错误是在控制表达式中把==写成=,在C语言中=号是赋值运算符,两者的含义完全不同。
  • 如果表达式所表示的比较关系成立则值为真(True),否则为假(False),在C语言中分别用1和0表示。例如x是-1,那么x>0这个表达式的值为0,x>-2这个表达式的值为1。
  • 在数学中a<b<c表示b既大于a又小于c,但作为C语言表达式却不是这样。以上几种运算符都是左结合的,请读者想一下这个表达式表示什么?
  • 这些运算符的两个操作数都应该是相同类型的,例如两边都是字符型、都是整型或者都是浮点型,但不能比较两个字符串,以后我们会介绍比较字符串的方法。
  • ==和!=称为相等性运算符(Equality Operator),其余四个称为关系运算符(Relational Operator),相等性运算符的优先级低于关系运算符。

总结一下 if(a!=0){...}else{...} 语句,首先计算 a!=0,判断它是真的还是假的,如果是真的,就执行 if 后的 {} 里的语句,打印 nonzero;否则就执行 else 后 {} 里的语句,打印 zero。这里的 3 不等于 0 是真的,所以就打印 nonzero 了。

应该注意到,if(a!=0) 后没有用 “;”结束,而是紧跟着 {} 了,这说明这条语句到 if(a!=0) 还没有结束,它的处理语句在 {} 里。if 的判断语句要持续到遇到 ; 或者 {} 才结束。

实际上,上述代码中的 {} 可以省去,请看:

int a = 3;
if(a != 0)
    printf("nonzero\n");
else
    printf("zero\n");

这是因为 if 和 else 后只有一条语句。如果有两条语句,就必须用 {} 了。例如:

int a = 0;
if(a != 0)
    printf("I know, it is ");
    printf("nonzero\n");

这几句代码会打印出 “nonzero”,这显然是错误的。为什么呢?上面,其实我们已经解释了,“if 的判断语句遇到 ; 或者 {} 结束。”,if(a!=0) 的作用范围持续到 printf("I know, it is "); 就结束了。所以 printf("nonzero\n"); 无论 a 是不是 0,都会输出。这种情况下,就需要 {} 了。

int a = 0;
if(a != 0){
    printf("I know, it is ");
    printf("nonzero\n");
}

这样的代码就什么也不会输出了,因为 a 不等于 0 是假的。

在C语言中,任何可以放“语句”的地方都既可以是一条语句,也可以是由{}括起来的若干条语句组成的语句块,如果是语句块则不需要在{}后面加;号。如果}后面加了;号,则这个;号本身又是一条新的语句了,在C语言中一个单独的;号表示一条空语句。

语句块中也可以定义局部变量,就像函数体一样。比如:

void foo(void)
{
    int i = 0;
    {
        int i = 1;
        int j = 2;
        printf("i=%d, j=%d\n", i, j);
    }
    printf("i=%d\n", i); /* 这里不能访问 j */
}

以上代码输出

i = 1, j = 2
i = 0

这个和函数的局部变量是同样的到里,可以参照《》一节。

if else 嵌套使用

现在又来了一个新问题:给定一个数,如果它大于 0 就输出 positive,如果等于 0 就输出 zero,如果小于 0,就输出 negative。这样的代码可以按照下面写:

int a = 3;
if(a>0)
    printf("positive\n");
else if(a==0)
    printf("zero\n");
else
    printf("negative\n");

好了,现在你已经学会 C 语言中 if/else 语句了,可以思考下面的问题了。刚刚那个代码也可以按照下面的方法写:

int a = 3;
if(a>0)
    printf("positive\n");
if(a==0)
    printf("zero\n");
if(a<0)
    printf("negative\n");

这两种写法有什么区别呢?(提示:执行效率)

另外,下面这几行代码编译时正常的,但是输出结果却是错的,虽然 x 并不大于 0,它还是输出了 “x is positive”,这是为什么呢?

int x = -3;
if (x > 0);
    printf("x is positive.\n");
阅读更多:   C语言
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif