C语言基础
内容提要
- 分支结构
- 条件判断
- 用if语句实现分支结构
分支结构
问题抛出
我们在程序设计往往会遇到如下问题,比如下面的函数的计算:
y = { 1 / x 当 x ≠ 0 时 10000 当 x = 0 时 y = \begin{cases} 1/x \quad当x\neq0时\\ \\ 10000 \quad当x=0时 \end{cases} y=⎩ ⎨ ⎧1/x当x=0时10000当x=0时
也就是我们必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言中实现分支结构主要使用if语句。
条件判断
根据某个条件成立与否,决定是否执行指定的任务(操作)。
条件判断的结果是逻辑值(布尔类型值,也就是说分支语句的条件可以使用关系表达式和逻辑表达式),在程序中用真(1)和假(0)来表示。
关系运算及其表达式
关系运算符及其优先级次序
关系运算符是用来进行比较的符号,C语言中提供了6种关系运算符:
关系表达式
关系表达式是指用关系运算符将两个表达式连接起来组成的有意义的式子。
在C语言中,用1(非0)表示关系表达式的值为真(条件成立),0表示关系表达式的值为假(条件不成立),即关系表达式的值要么为1(条件成立,)要么为0(条件不成立)
问题抛出
有时,只用一个简单的关系表达式无法完整的表达一个条件:
y = { 1 / x + 1 / a 当 x ≠ 0 , a ≠ 0 时 10000 其他 y = \begin{cases} 1/x+1/a \quad当x\neq0,a\neq0时\\ \\ 10000 \quad其他 \end{cases} y=⎩ ⎨ ⎧1/x+1/a当x=0,a=0时10000其他
其中的条件需要用逻辑表达式来表示:x!=0 && a!=0,&&就是一种逻辑运算符。
逻辑运算及其表达式
逻辑运算符及其优先级
- 逻辑运算符是构成复杂的复合条件的运算符。
C语言中提供了三种逻辑运算符:
符号 | 名称 | 分类 | 说明 |
---|---|---|---|
&& | 逻辑与 | 双目运算符 | 两个量都为真时为真(1),否则为假(0) |
|| | 逻辑或 | 双目运算符 | 两个量中只要有一个为真即为真(1),只有两个量都为假时才为假(0) |
! | 逻辑非 | 单目运算符 | 运算量真时变为假(0),假时变为真(1) |
逻辑表达式
a | b | !a | !b | a&&b | a||b |
---|---|---|---|---|---|
非0 | 非0 | 0 | 0 | 非0 | 非0 |
非0 | 0 | 0 | 非0 | 0 | 非0 |
0 | 非0 | 非0 | 0 | 0 | 非0 |
0 | 0 | 非0 | 非0 | 0 | 0 |
用逻辑运算符将关系表达式或逻辑表达式连接起来的构成有意义的式子。
逻辑表达式中各种运算符的优先级顺序如下:
!(逻辑非)→算术运算符(±*/%)→关系运算符(>、<、>=、<=、==、!=)→&&和||→赋值运算符(=、+=…)
C语言编译系统在表示逻辑运算符结果时:用1表示真,用0表示假。
案例:
假设a = 4,b = 5,则:
!a --0
a && b --1
a || b --1
!a || b --1
4 && 0 || 2 --1
小贴士:
实际上,逻辑运算符两侧的运算对象不但可以时0和1,或者时0和非0,而且也可以是字符型、实型和指针型等。系统最终是以0和非0来判定他们的真假的,例如:
‘c’ && 'd’结果为1
用if语句实现分支结构
单分支:if …
-
语法:
//语法1:可以舍弃{} if(条件表达式)单语句;//语法2:必须保留{} if(条件表达式) {单语句或者复合语句; }
-
流程图
-
功能
- 若表达式值为真(非0),则执行表达式后面的语句,执行完该语句后继续执行if语句后的代码。
- 若表达式值为假(0)则不执行表达式后面的语句而直接执行if语句后面的语句。
-
说明:
- 如果表达式后面的是复合语句,则要用一对花括号{}括起来,单语句可有可无。
-
案例:
-
要求:计算并输出下列分段函数的值:
y = { − 2 x < 0 2 x ≥ 0 y = \begin{cases} -2 \quad x<0\\ \\ 2 \quad\quad x\geq0 \end{cases} y=⎩ ⎨ ⎧−2x<02x≥0
-
流程图:
-
代码:
/*************************************************************************> File Name: demo01.c> Author: zk> Description: 单分支案例 > Created Time: 2025年02月11日 星期二 10时42分43秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {//创建两个变量,用来存储两个操作数double x,y = -2;//从控制台输入xprintf("请输入一个数,作为x的值:\n");scanf("%lf",&x);//校验if(x >= 0) y = 2;printf("x=%lf,y=%lf2\n",x,y);return 0; }
-
运行结果:
-
-
案例:
-
需求:有a,b,c三个数,要求从控制台输入,并且求出最大值
-
分析:
1.通过控制台输入a,b,c的值
2.创建一个变量max,用来存放a,b,c中的最大值,默认a是最大值(这样可以减少一次判断)
3.让b,c和max进行比较,将最大值存入max
-
代码:
/*************************************************************************> File Name: demo02.c> Author: zk> Description: 单分支案例:有a,b,c三个数,要求从控制台输入,并且求出最大值 > Created Time: 2025年02月11日 星期二 10时58分41秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {//创建4个变量啊a,b,c,maxint a,b,c,max;//通过键盘输入数据给a,b,cprintf("请输入三个整数:\n");scanf("%d%d%d",&a,&b,&c);//默认a是最大值max = a;//让最大值分别和b和c比较if(max < b) max = b;if(max < c) max = c;//a,b中的最大值和c进行比较,得到最大值printf("输入的三个数是%d %d %d,其中最大值是%d\n",a,b,c,max);return 0; }
-
运行结果:
有可能产生的问题:
①scanf()同时输入多个变量时,默认使用空格、Tab键、回车键进行区分。
②在变量赋值前使用变量,导致运算结果错误(变量未赋值前,系统会给变量分配随机值)
-