前言:
由于对C语言的理解不够深刻,且距离上次学习C语言的时间过于“久远”,所以本人准备重新开始学习C语言。
那么刚好借这个机会,既向大家分享我的学习笔记,同时又能监督我自己去努力学习这门语言,为将来从事嵌入式行业打下基础!!
学习C语言是很漫长的,要重新整理一遍学习的内容更是反复且枯燥的。但不积跬步,无以至千里,没有什么事情是一蹴而就的,我们要学会沉下心来,一起努力,一起期待未来!!
今天的笔记主要是围绕认识与运用表达式与运算符:了解表达式的定义以及常用类型,了解运算符并熟悉运算符的运算优先级,表达式与运算符的运用。
目录
表达式
表达式的定义
在C语言中,由一个或多个运算符将一个或多个变量、常量、函数调用返回值结合的语法结构,称之为表达式。
2023; 'A'; "JICHI"; a + b; a - b; 10 * a / b % 2; a++; b--;
在示例代码中,这些都是合法的表达式。当然a、b都需要提前声明并进行初始化定义。
表达式常用类型
常量表达式
4; 6.18; 'A';
用作常量的式子,并且可在可使用常量的任何位置使用。
算术表达式
a + b; a - b; a * b; a / b; a++; ++a;
用算术运算符和括号将运算对象连接起来的的式子。
赋值表达式
a = b; a = b - 1; a = 12;
用赋值运算符将运算对象连接起来的的式子。
赋值号左边必须为左值,赋值号右边的右值可以为常量、变量或表达式。
关系表达式
a < b; a >= b; a == b; a != b;
用关系运算符将两个运算对象连接起来的式子。
关系表达式的值是一个逻辑值,即“真”或“假”
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
逻辑表达式
!a; a && b; a || b;
用逻辑运算符将两个运算对象连接起来的式子。
逻辑表达式的值是一个逻辑值,即“真”或“假”
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
复合表达式
a = 9 % 2 - 2 * +2 && 2 || !1;
用作算数、关系、逻辑运算对象混合运算的式子。
需要考虑运算时运算符的优先级。
运算符
算数运算符
加法运算符+
int a, b; a = 100; b = 10; a + b;//结果为110
在示例代码中,+ 为加法运算符,它左右边各需要一个运算对象,构成加法运算符表达式,其结果为左右表达式结果相加。
减法运算符-
int a, b; a = 100; b = 10; a - b;//结果为90
在示例代码中,- 为减法运算符,它左右边各需要一个运算对象,构成减法运算符表达式,其结果为左右表达式结果相减。
符号运算符+ -
-99;//结果为-99 +99;//结果为99 -(-99);//结果为99
在示例代码中,+ - 号为符号运算符,可用于改变表达式的正负,且负负得正。
乘法运算符*
int a, b; a = 100; b = 10; a * b;//结果为1000
在示例代码中,* 为乘法运算符,它左右边各需要一个运算对象,构成乘法运算符表达式,其结果为左右表达式结果相乘。
除法运算符/
int a, b; a = 100; b = 10; a / b;//结果为10
在示例代码中,/ 为除法运算符,它左右边各需要一个运算对象,构成除法运算符表达式,其结果为左运算对象除以右运算对象。
注意:当左右运算对象都为整型时,除法运算符表达式的结果也为整型,无法输出浮点数;若想求出浮点数,可将运算对象的数据类型进行初始化定义或强制类型转换。例如:
float a; int b; a = 9; b = 2; a / b;//结果为4.5
取余运算符%
int a, b; a = 105; b = 10; a % b;//结果为5
在示例代码中,% 为取余运算符,它左右边各需要一个运算对象,构成取余运算符表达式,其结果为右运算对象对左运算对象求余。
自增、自减运算符++ --
#include "stdio.h" void main() { int a, b, c, d; a = b = 0; c = d = 1; printf("前缀自增过程a=%d 后缀自增过程b=%d\n", ++a, b++); printf("前缀自增结果a=%d 后缀自增结果b=%d\n", a, b); printf("前缀自减过程c=%d 后缀自减过程d=%d\n", --c, d--); printf("前缀自减结果c=%d 后缀自减结果d=%d\n", c, d); }
在示例代码中,++ 为自增运算符,-- 为自减运算符。它仅需要运算符左边或右边有一个运算对象即可。
运算符置于左边被称作前缀;置于右边被称作后缀。
前缀与后缀的区别
我们运行示例代码
我们可以发现:
在前缀自增或自减的过程中,数值就已经变化了,表达式的结果为运算对象值加减1。
在后缀自增或自减的过程中,数值没有发生变化,但表达式的结果为运算对象值加减1。
那我们就可以总结出:
前缀自增或自减先进行运算再进行取值;后缀自增或自减先进行取值再进行运算。
赋值运算符=
a = 105;
在示例代码中,= 为赋值运算符,它左右边各需要一个运算对象,构成赋值运算符表达式,其结果为等号右边运算对象的值。
一元运算符与二元运算符区别
一元运算符:只有一个运算对象的运算符,自增自减运算符;
二元运算符:有两个运算对象的运算符,如加减法运算符,赋值运算符。
运算符优先级
优先级顺序从高到低如下表所示:
表达式与运算符的运用
当我们了解了表达式与运算符的基本原理,就可以进行一些简单的运用:
拆分一个三位数的个位、十位、百位:
#include "stdio.h" #include "math.h" void main() { int a,b,c,d; printf("请输入三位数:"); scanf("%d", &a); b = a / 100; c = a % 100 /10; d = a % 10; printf("百位 %d 十位 %d 个位 %d\n", b, c, d); }
求1-100能被5整除的数:
#include "stdio.h" void main() { int num = 1; printf("1-100能被5整除的数:\n"); while (num <= 100) { if (num % 5 == 0) printf("%d ", num); if (num % 20 == 0) printf("\n"); num++; } }