条件表达式
你喜欢运动吗?你想成为一名优秀的程序员吗?存在于生活中的很多类似的问题如果仅从字面回答都可以得到一个是/否、有/没有等类似的真或假的回答。对于程序世界也存在这样的对话,如,数值a小于数值b吗?当然,程序世界中的这种比较关系有确定的运算符号,被称为条件运算符。同引入+-*/符号一样,C语言引入了小于(<)、大于(>)、小于等于(<=)、大于等于(>=)比较运算符,以及不等于(!=)运算符。基于比较运算符构的表达式,称为条件表达式。它如同一个提问一样,可以产生一个真或假的结果值。
真假值
在C语言中,0值代表假,非0值代表真。随着语言的发展,引入了bool类型,定义在头文件 stdbool.h中。bool类型有两个值,true代表真值,false代表假值。这两者之间有等价关系,任何能转换为0值的表达式,其结果也是false,反之也成立产。
int a = 5;
int b = 7;
a > b; // false
b < 12; // true
a != b; // true
if语句
C语言提供了if语句,结合条件表达式,便可以用来创建程序分支结构。最简单的if语句形式如下:
/* if ( 条件表达式成立 )
执行这条件语句;
不成立时执行到这里
*/
if ( 'a' < 'b' )
printf( "letter 'a' < 'b'\n" );
if ( 3 > 4 )
printf( "number 3 > 4" );
printf( "run to here!" );
这个语法的一个变形就是在条件表达式成立后执行多条语句,这时可以使用一对大括号{}将多个语句包装成一个语句块。
/* if ( 条件表达式成立 )
{
语句1;
语句2;
}
不成立时执行到这里
*/
int a = 34;
int b = 23;
if ( a > b )
{
printf( "a=%d, b=%d\n", a, b );
printf( "a > b\n" );
}
// 当然,一条单独的语句也可以构成一个语句块。
if ( 1 )
{
printf( "true\n" );
}
if-else语句
if语句更多的用途是提供分支结构,这是配合else子句来实现的。
/*
if ( 条件表达式成立 )
执行语句或语句块1;
else
不成立时执行语句或语句块2;
*/
if ( 'a' > 'b' )
printf( "'a' > 'b': true\n" );
else
printf( "'a' > 'b': false\n" );
当有多于2个可供选择的分支时,可以使用另一种变形形式if-elseif-else…,尽管这种情况下程序可以有很多分支,但一旦某条分支成立,就代表当前层的if-else语句块就结束了,退出到上层,最后直到整个if-else结构退出。
/*
if ( 条件表达式1 )
{
语句或语句块1;
}
else if ( 条件表达式2 )
{
语句或语句块2;
}
else
{
语句或语句块3;
}
*/
int level = 5;
float velocity = 0.5f;
if ( level == 1 ) velocity += 0.5f;
else if ( level == 2 ) velocity += 0.7f;
else if ( level == 3 ) velocity += 1.2f;
else if ( level >= 4 ) level = 2.0f;
完整示例
#include <stdio.h>
#include <stdbool.h>
void main()
{
//============================= 第1种形式
if ( 'a' < 'b' )
printf( "letter 'a' < 'b'\n" );
if ( 3 > 4 )
printf( "number 3 > 4" );
printf( "#1 --- run to here\n\n" );
// 第1种形式(使用语句块)
int a = 34;
int b = 23;
bool state = a > b;
if ( state )
{
printf( "a=%d, b=%d\n", a, b );
printf( "a > b\n" );
}
// 一条单独的语句也可以构成一个语句块
if ( -1 )
{
printf( "true\n\n" );
}
//============================= 第2种形式 if-else
if ( 'a' > 'b' )
printf( "'a' > 'b': true\n" );
else
printf( "'a' > 'b': false\n" );
printf( "#2 --- run to here\n\n" );
//============================= 第3种形式(多个分支)
int level = 5;
float velocity = 0.5f;
if ( level == 1 ) velocity += 0.5f;
else if ( level == 2 ) velocity += 0.7f;
else if ( level == 3 ) velocity += 1.2f;
else if ( level >= 4 ) velocity = 2.0f;
printf( "level=%d, velocity=%f\n", level, velocity );
}
让飞机动起来
现在我们扩展《使用glimix_c库使学习C更加有趣》一节的示例,使用if-else语句让飞机能够在屏幕上飞起来。首先,我们加入两个变量xpos,xspeed,分别用于控制飞机的位置与速度。
int pic1 = -1; // 保存第一张图像的id(初始设置为-1,表示没有加载成功)
int pic2 = -1; // 保存第二张图像的id
int xpos = 640; // 飞机的起始位置(在屏幕右端)
int xspeed = -2; // 飞机的速度(-2表示向左飞行,+2表示向右飞行)
接下来就是更新绘制部分,这是更新后的draw函数。
void draw()
{
glmxDrawImage( pic1, 0, 0 );
glmxDrawImage( pic2, 40, 40 );
glmxDrawImage( pic2, 180, 280 );
// 更新飞机位置
xpos += xspeed;
if ( xpos <= 0 )
{
// 如果已经飞出屏幕左边,则改变飞行方向让其向右边飞行。
xspeed = +2;
}
else if ( xpos >= 640 )
{
// 如果已经飞出屏幕右边,则改变飞行方向让其向左边飞行。
xspeed = -2;
}
glmxDrawImage( pic2, xpos, 80 );
}
只使用几行简单的代码,我们便能使整个程序显得有生机起来,这或许也是编程的魅力之一。细心的你可能会发现,飞机在飞到屏幕右边后,并没有掉转头,而是硬生生的被怼了回去,这显得极不真实。你可以查看一下glimix.h中提供的其它类似的draw函数,改进程序去解决这个问题。