2019-02-21计算机二级C语言程序设计之选择结构

参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》

关系运算和逻辑运算

C语言的逻辑值

在C语言中,用非0表示“真”,用0表示“假”。

关系运算符和关系表达式

所谓关系运算实际上是“比较运算”,即进行两个数的比较,判断比较的结果是否符合指定的条件。

C语言的关系运算符

C语言提供了6种关系运算符,它们分别是:

  1. <(小于)
  2. <=(小于或等于)
  3. > (大于)
  4. >=(大于或等于)
  5. ==(等于)
  6. !=(不等于)

注意:由两个字符组成的运算符之间不能有空格。

关系运算符是双目运算符,并且具有自左至右的结合性。

关系表达式及关系表达式的值

由关系运算符构成的表达式,称为关系表达式。关系表达式的计算结果为“逻辑值”,只有两种可能:真(1)或假(0)。

逻辑运算符和逻辑表达式

C语言的逻辑运算符

C语言提供了3种逻辑运算符,分别是:

  1. &&(与)
  2. ||(或)
  3. !(非)

其中,&&和||为双目运算符,为单目运算符并且出现在对象的左边。

逻辑表达式和逻辑表达式的值

由逻辑运算符和运算对象组成的表达式称为逻辑表达式。逻辑运算的对象可以是C语言中任意合法的表达式。

如果表达式中使用了逻辑运算符,那么该表达式的计算结果取决于其运算对象。逻辑表达式的运算结果或者为1(真),或者为0(假)。

当a和b为任意合法表达式时,逻辑运算规则如下表:

表达式 计算结果
a&&b 当且仅当a与b都为真时,表达式为真(1);否则表达式为假(0)。
a||b a和b有一个为真,表达式为真(1);a和b都为假,表达式为假(0)。
!a 如果a为真,表达式为真(0);如果a为假,表达式为假(1)。

if语句和用if语句构成的选择结构

if语句

if语句的基本格式是,对表达式求职并根据求值结果命令程序执行特定内容。if语句的格式如下:

if (表达式)
    语句

如果表达式为真,就执行语句;如果表达式为假,则不执行语句。可以认为,是否执行语句取决于表达式的结果。

通过使用复合语句或块,if语句可以控制多条语句的执行。

else子句

if语句可以包含else子句,方法如下:

if (表达式)
    语句1;
else
    语句2;

如果表达式计算结果为真,则执行语句1。如果表达式计算结果为假,控制将转到else语句,执行语句2。语句1和语句2都可以是复合语句或块。

关于if语句的说明

  1. if后面圆括号中的表达式,可以是任意合法的C语言表达式(如:逻辑表达式、关系表达式、算术表达式、赋值表达式等),也可以是任意类型的数据(如:整型、实型、字符型、指针型等)。
  2. 无论是否有else子句,if子句中如果只有一条语句,则此语句后的分号不能省略。

嵌套的if语句

内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。

在if子句中嵌套具有else子句的if语句

if (表达式1)
    if (表达式2)
        语句1
    else
        语句2
else
    语句3

当表达式1的值非0时,执行内嵌的if-else语句;当表达式1的值为0时,执行语句3。

在if子句中嵌套不含else子句的if语句

if (表达式1)
{
    if (表达式2)
        语句1
}
else
    语句2

注意:在if子句中的一对花括号不可缺少。因为C语言的语法规定:else子句总是与前面最近的不带else子句的if相结合,与书写格式无关。

在else子句中嵌套if语句

语句形式1:内嵌的if语句带有else子句:

if (表达式1)
    语句1
else if (表达式2)
    语句2
else
    语句3

语句形式2:内嵌的if语句不带else子句:

if (表达式1)
    语句1
else if (表达式2)
    语句2

条件表达式构成的选择结构

条件运算符

条件运算符由两个运算符组成,它们是"?"和“:”。条件运算符是C语言唯一的三元运算符,这意味着需要3个运算对象。

由条件运算符构成的条件表达式

条件表达式的形式如下:

表达式1 ? 表达式2 : 表达式3

条件表达式的运算功能

当表达式1的值为非0时,求出表达式2的值,此时表达式2的值就是整个条件表达式的值。

当表达式1的值为0时,则求表达式3的值,这时表达式3的值为整个条件表达式的值。

switch语句以及用switch语句和break语句构成的选择结构

switch语句

switch语句形式如下:

switch (表达式)
{
    case 常量表达式1:
        语句1
    case 常量表达式2:
        语句2
    …
    case 常量表达式n:
        语句n
    default:
        语句n+1
}

说明:

  1. switch是C语言的关键字,switch后用花括号括起来的部分称为switch语句体
  2. 紧跟在switch后一对圆括号中的表达式可以是整型表达式及字符型表达式等。
  3. case也是关键字,与其后面的常量表达式合称case语句标号。常量表达式的类型必须与switch后圆括号中的表达式类型相同,各case语句标号的值应该互不相同。
  4. default也是关键字,起标号的作用,代表所有case标号之外的那些标号。default标号可以出现在语句体中任何标号位置上。在switch语句体中也可以没有default标号。
  5. case语句标号后的语句1,语句2等,可以是一条语句,也可以是若干条语句。
  6. 必要时,case语句标号后的语句可以省略不写。
  7. 在关键字case和常量表达式之间一定要有空格。

switch语句的执行过程

switch语句对表达式求值,并与每个case标签后的常量表达式作比较,会出现下面的情况之一:

  • 如果找到与表达式匹配的常量表达式,程序将跳转执行case标签后面的语句。
  • 如果没有匹配的常量表达式,程序将跳转执行default标签(可选)后面的语句。
  • 如果没有匹配的常量表达式,也没有default标签,程序将跳过switch语句体,去执行switch语句之后的语句。

程序举例:

#include <stdio.h>

int main ( void )
{
int reply;
puts ("Enter a number between 1 and 5:");
scanf ("%d", &reply);
switch (reply)
{
    case 0:
        break;
    case 1:
        puts("You entered 1.");
    case 2:
        puts("You entered 2.");
    case 3:
        puts("You entered 3.");
    case 4:
        puts("You entered 4.");
    case 5:
        puts("You entered 5.");
    default:
        puts("Out of range, try again.");
}
return 0;
}

假设输入2,那么输出为:

Enter a number between 1 and 5:
2
You entered 2.
You entered 3.
You entered 4.
You entered 5.
Out of range, try again.

看上去虽然switch语句找到了第一个匹配的常量表达式,然后却执行了后面的所有语句(并非只执行匹配的语句)。情况确实如此,事实上,switch语句执行了下面要讲的goto语句来匹配常量表达式。为确保只执行与匹配常量表达式相关的语句,还需要包含break语句。

在switch语句体中使用break语句

berak为C语言关键字,berak语句又称间断语句。可以将break语句放在case标号之后的任何位置,通常是case之后的语句最后加上break语句。每当执行到break语句时,立即跳出switch语句体。

利用break语句修改上面的程序:

#include <stdio.h>

int main ( void )
{
    int reply;
    puts ("Enter a number between 1 and 5:");
    scanf ("%d", &reply);
    switch (reply)
    {
        case 1:
        {
            puts("You entered 1.");
            break;
        }
        case 2:
        {
            puts("You entered 2.");
            break;
        }
        case 3:
        {
            puts("You entered 3.");
            break;
        }
        case 4:
        {
            puts("You entered 4.");
            break;
        }
        case 5:
        {
            puts("You entered 5.");
            break;
        }
        default:
        {
            puts("Out of range, try again.");
            break;
        }
    }
    return 0;
}

假设输入2,那么输出为:

Enter a number between 1 and 5:
2
You entered 2.

语句标号和goto语句

语句标号

在C语言中,语句标号不必特意加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,如:flag1:、stop0:,该标识符就成了一个语句标号

注意:在C语言中,语句标号必须是标识符,因此不能简单地使用10:、15:等形式。标号可以和变量同名。

在C语言中,可以在任何语句前加上语句标号。例如:

stop: printf("End\n");

goto语句

goto语句称为无条件转向语句。程序执行至goto语句时,将立即跳转至goto语句指定的位置继续执行。

与if语句不同的是,该语句是无条件的,因为无论情况如何,程序执行到goto语句都会进行跳转。

goto语句的一般形式如下:

goto 语句标号;

注意:该语句标号必须与goto语句在同一个函数内。

运算符优先级归纳

注:表中同一行的运算符优先级相同。

优先级 运算符
1 ( )(函数运算符) [ ](数组运算符) ->
2 ! ~ ++ -- *(间接运算符) &(取址运算符) sizeof +(一元) -(一元)
3 *(乘法) / %
4 +(二元) -(二元)
5 >> <<
6 < <= > >=
7 == !=
8 &(按位与)
9 ^
10 \
11 &&
12 \
13 ?:
14 = += -= *= /= &= ^= |= <<= >>=
15 ,
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容