欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C程序设计基础(2):基本分支结构语句(if switch)和逻辑运算符

程序员文章站 2022-07-16 21:30:01
...

  上一节中,我们学习了C语言的基本程序框架和Format I/O(格式化输入\输出相关内容)。本周的作业中依然以printf scanf两个语句为主,有关不同格式的输入输出转换说明(读入ASCII输出字符、各种进制转换等),以及Mooc测试中出现的scanf中抑制赋值修饰符*等的详细讲解,请移步第一节内容基本程序框架和Format IO (printf、scanf)。本节,我们将学习基本分支结构语句和逻辑运算符。作业中目前仅对if做出要求,但由于篇幅过短,本节将会介绍C语言中的所有基本分支结构语句(if switch),并给出基本逻辑运算符。

C程序设计基础(2):基本分支结构语句(if switch)和逻辑运算符

基本分支结构

  在顺序结构程序中,一段代码往往只能完成一个任务,且对功能限定较严格。类似于藏宝图的叙述“向南几步,左转几步,走几步到……”。然而现实中,往往会出现一些需要做出选择或是可能出现偏差的情况。前者类似“天亮抄小路,天亮走大路”,后者则类似“如果走到某处,则右转,否则继续走”。分支结构语句极大拓展了程序对不同情况的适应和处理较为复杂任务的能力


if判断语句

  if判断语句是最基本的分支语句。if语句判断一个表达式,并仅给出两种情况:符合/不符合(这在许多其他语言中被定义为布尔型(Boolean)变量True \ False)。并且,if语句定义了如果表达式成立,将做什么(必选);若不成立,将做什么(可选)。程序运行时,将判断表达式是否成立,并按照预先设置的指令运行。

语法

//单分支语句
if (expression) do-something;
//or
if (expression)
    do-something;
//带有不成立情况
if (expression)
    do-something;
else
    do-something;
//使用语句块
if (expression)
{
    do-something1;
    do-something2;
    ...
}
else
{
    do-something1;
    do-something2;
}

关键字释义

  • if:如果,if条件判断语句的首要关键字,标志if语句的开始,其后定义了当表达式为真的时候需要执行的操作
  • expression:一个表达式,C中的表达式是一个很宽泛的概念,将在后面说到
  • else:否则,(可选),必须跟随if条件判断语句出现(不能单独出现),其后定义了当表达式为假的时候需要执行的操作
  • {}:语句块,当一个条件判断完成后如果要执行多个语句,则必须使用大括号将这些语句包含,形成一个语句块

注意事项

  • 由于C语言不依赖缩进判断语句的从属,任何缩进的暗示对C语言编译器无效,下面给出一个错误例子和正确例子,

    假如表达式为真时需要执行语句ab

    //错误样例
    if (expression)
        a;
    	b;
    //正确样例
    if (expression)
    {
        a;
        b;
    }
    

    第一个例子中,使用缩进暗示了如果表达式为真,将执行ab。然而,由于C较为直男严谨,将不会注意这个暗示,如果为真,将在执行a语句后跳出。所以,无论条件是否为真,b语句将一定会执行

    第二个例子使用语句块,解决了这个问题

  • 语句块使用相对灵活,没有规定if后使用语句块,则else后一定也要使用,反之亦然

  • 表达式外一定要加小括号,否则将出现语法错误、

  • 对于语法样例中单分支语句的两种形式都正确。一种为紧凑型,整个条件判断在一行中完成;另一种则方便设计和维护人员分辨语句的从属关系,方便修改维护。

条件判断语句的嵌套

if条件判断语句允许嵌套,即在某一个分支中继续使用if语句,如

if (ex1)
	if (ex2)
    {
        do-something;
    }
	else
        do-something;
else
{
    ...
}

样例中在表达式为真的分支后插入了一个条件判断语句

但是,在使用if语句嵌套时,一定要注意ifelse的配对问题

else将和**同级的最近一个if**配对,如样例中的第一个else将和表达式为ex2if语句配对,第二个则将和表达式为ex1的语句配对。

如果遇到需要另外配对的情况,请通过使用语句块确定从属等级

嵌套优化

对于使用多个嵌套语句的情形,如果直接使用嵌套,将会导致语句较复杂,难以分清从属,导致设计出现失误,可以使用else if语句优化嵌套过程,对于以下语句,

if (ex1)
    do1;
else
{
    if (ex2)
        do2;
    else
        do3;
}

可以优化为

if (ex1)
    do1;
else if (ex2)
    do2;
else
    do3;

从字面意义上来说理解较为简单,这里不再赘述。


switch分支语句

对于一个变量的多种取值情况,C语言使用switch语句来进行判断。某种意义上,switch语句是一种if语句在特殊情况下的简化版。

语法

以下if判断语句与switch语句的功能相同,可对照进行比较

if (a == 1)
    do1;
else if (a == 2)
{
    do2;
    ...
}
else if (a == 3)
    do3;
...
else
    don;
switch (a)
{
    case 1:
        do1;
        break;
    case 2:
        do2;
        ...
        break;
    case 3:
        do3;
        break;
    default: //可选
        do-other;
}

关键字释义

  • switch: 切换,switch语句的开始,其后用括号包含的表达式时语句需要判断的主体表达式
  • case: 情况,当表达式与其后跟随的静态表达式相等时,将从其从属语句开始执行命令
  • break: 跳出命令,当执行到此处时,将跳出整个当前块(这里是switch语句块)
  • default: 缺省情况,可选,当表达式的值与所有case后的静态表达式不相等,将从这里开始执行语句

注意事项

  • 一定注意:当表达式与其中一个case匹配(包括default),将从这里开始执行语句,以后将不再进行case判断,而是执行所有语句,直到遇到break,如

    switch (a)
    {
        case 1:
            do1;
        case 2:
            do2;
        case 3:
            do3;
        	break;
        ...
    }
    

    a的值为1,则将执行do1 do2 do3三条语句(由于没有遇到break),如果想要在执行玩所属语句后跳出整个switch,请使用break;语句

  • switch语句第一行下面的分支内容需要使用大括号包含,表示从属于该switch语句

  • case后的表达式都是静态的,即不可为变量等可变内容


表达式

表达式(expression),是程序设计中的核心内容。在C语言中,表达式的定义十分宽泛,它可以是一个值,一个数学运算式(结果还是一个值),一个不等式(不等式就是一个由数学运算符构成的表达式),或是多个子表达式通过逻辑运算符合成的大表达式等等。下面,让我们来逐一了解。

数字

数字作为表达式,听起来有些不可思议。但由于C语言中没有布尔型变量,所以它的功能是由数字变量代替的。

C语言中定义,值为零的数字判断为假,任何不为零的数字(包括负数)将判断为真

通过这样定义,将大大方便程序编写,一个表达式counter != 0将直接可以简化为counter

数学运算式本质就是求值,然后结果的值参与上述数字判断,这里不再赘述。

数学运算式

数学运算式符合我们对表达式的理解,对于原理不再讲解,下面给出常见的数学关系运算符

关系运算符 说明
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
  • 注意:C语言中,=是赋值运算符,==是才是关系运算符,千万不能误用。如果误用,将导致一个赋值语句的执行,并且,赋值语句的返回值就是它的右值。如果一个赋值语句的右值不为0,将判断为真,否则为假

逻辑运算符

实际应用中,我们常常遇到一个表达式中需要包含多个表达式,并用逻辑关系连接的情况,如

  • a和b要同时满足a && b
  • a和b满足一个,a || b
  • a必须满足,b和c满足一个, a && (b || c)

下面给出逻辑运算符表

逻辑运算符 说明
&& 逻辑与
|| 逻辑或
  • 注意:&是位运算符,&&才是逻辑运算符,千万不能混用
  • 逻辑与的优先级高于逻辑或(类似乘法优先级高于加法),将首先进行运算,使用时需要注意,必要时使用小括号手动指定优先级

表达式判断的最少原则

条件判断语句中,对表达式的处理遵循最少原则,即多个子表达式通过逻辑运算符连接时,语句执行时一定执行最少个,下面给出几个简单的例子

  • 多个表达式通过逻辑与连接,语句执行到第一个值为假的表达式,则直接结束判断,返回假,后面的表达式不会执行。
  • 多个表达式通过逻辑或连接,语句执行到第一个值为真的表达式,则直接结束判断,返回真,后面的表达式不会执行。
相关标签: C