到目前为止,我们举的 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");