知识点一:表达式
1)什么是表达式:在C语言中,一个或多个运算对象与零个或多个运算符组成表达式;
例:
100
5 + 10
a / b
a * 10 / b + c
2)表达式的结果:
printf("%d\n", 5 + 10);
运算符与运算对象进行运算操作必然产生一个结果,因此每个表达式都有一个结果。例如上面的表达 式 5 + 10 的结果为15。
3)表达式语句:
a)表达式后面加上分号构成表达式语句;
b)C语言中表达式不能单独存在,必须以表达式语句的形式存在;
例:
100;
5 + 10;
a / b;
a * 10 / b + c;
“但下面表达式5+10后面却没有分号”
printf("%d\n", 5 + 10);
#因为 5 + 10 是一个子表达式,函数名加上括号运算符,构成了一个函数调用表达式。 所以, 5 + 10 为函数调用表达式的子表达式,而函数调用表达式后面加了分号了。
#函数调用表达式也有一个表达式结果,这个结果就是函数的返回值了。
知识点二:加法运算符+
1)+ 为加法运算符,它左右边各需要一个运算对象,构成 加法运算符表达式;
2)表达式结果:加法表达式的结果为左右表达式结果相加;
int a, b;
a = 200;
b = 100;
a + b; // 表达式结果为300
知识点三:减法运算符—
1)- 为减法运算符,它左右边各需要一个运算对象,构成 减法运算符表达式;
2)表达式结果:减法表达式的结果为左右表达式结果相减;
int a, b;
a = 200;
b = 100;
a - b; // 表达式结果为100
知识点四:符号运算符 +、-
1)+ 用于标明一个表达式的正负, - 用于改变一个表达式的正负;
2)与加减运算符不同的是,它仅需要在运算符右边有一个运算对象;
3)表达式结果:
a)+ 号表达式的结果为右边运算对象的值;
b)- 号表达式的结果为右边运算对象值的相反数;
+100; // 表达式结果为100
-100; // 表达式结果为-10
4)用于改变表达式的正负:
int a = 100;
-a; // 表达式结果为-100
5)请注意:+不能改变表达式的正负,请使用负负得正;
int a = -100;
+a; // 表达式结果为-100
-a; // 表达式结果为100
知识点五:乘法运算符 *
1)* 为乘法运算符,它左右边各需要一个运算对象,构成 乘法运算符表达式;
2)表达式结果:乘法表达式的结果为左右表达式结果相乘;
3)* 是乘法运算符,注意不要误用为字母x;
int a, b;
a = 200;
b = 100;
a * b; // 表达式结果为20000
知识点六:除法运算符 /
1)/ 为除法运算符,它左右边各需要一个运算对象,构成 除法运算符表达式 ;
2)表达式结果:除法表达式的结果为左运算对象除以右运算对象;
int a, b;
a = 200;
b = 100;
a / b; // 表达式结果为2
3)整型无法整除问题:
a)对于除法,请特别注意整型无法整除时,出现浮点类型数据的问题;
int a, b, c;
a = 5;
b = 2;
c = a / b;
#a 的值为 5 , b 的值为 2 。那么 5 除以 2 ,应该等于 2.5 。 但是,使用 int 来接收 2.5 好像不太对,那我们把 c 改为 float 或 double 。
int a, b;
a = 5;
b = 2;
float c;
c = a / b;
printf("%f\n", c);
#显然结果依然不对
#在C语言里面,整型与整型运算的结果,依然是一个整型。结果的小数部分被丢弃,这一过程被称作截断。a / b后,结果仍然是一个整型,数值已经被截断了,这时候,我们再赋给一个浮点型的c。也只能 是整数2转成浮点2.0了,没有起到效果。
&那我们将a,b,c都改为float,这样就不会出现截断了。a,b将会进行浮点运算,结果也是一个浮点数类型float;
float a, b, c;
a = 5;
b = 2;
c = a / b;
printf("%f\n", c);
知识点七:求余运算符 %
1)% 为求余运算符,它左右边各需要一个运算对象,构成 求余运算符表达式 ;
2)表达式结果:求余表达式的结果为左运算对象除以右运算对象的余数;
例如:10%3,10除以3,等于3余1
int a, b;
a = 10;
b = 3;
a % b; // 表达式结果为1
知识点八:赋值运算符 =
1)= 为赋值运算符,它左右各需要一个运算对象,构成 赋值运算符表达式;
2)赋值 表达式的结果为等号右边的运算对象的值;
3)赋值表达式还会将等号右边运算对象的值,传递给左边的运算对象;
a = 100; // 赋值表达式语句
4)赋值与初始化的区别:
int a = 100; // =表示初始化,不是赋值运算符
a = a + 150; // 赋值运算符,将右边的表达式结果赋值给左边的变量a。
在上面的代码中,第一行代码声明了一个变量a。请注意,声明变量时并将它初始化为100所用的 = 号, 不是赋值运算符,而是变量初始化。虽然初始化和赋值很像,但是 = 号左边并不是一个单纯的变量,而是变量的声明。你可以借此来区别它们。
5)求一个赋值表达式的结果:
表达式 a = a + 50 是一个复合表达式,先求得子表达式 a + 50 的结果,为150。再求表达式 a = 150 的 结果,即 150 。另外,赋值表达式除了计算出表达式的结果外,还会将 150 赋值给变量 a
6)不能给常量赋值:给常量赋值是错误的,因为常量不能被更改;
"Hello" = "HelloWorld";
'a' = 'b';
100 = 200;
“以上赋值为错误方式”
知识点九:自增、自减运算符
1)++ 为指自增运算符, -- 为自减运算符。它们仅需要运算符左边或右边有一个运算对象即可;
2)运算符置于左边被称作前缀模式。例如: ++i --i ;
3)运算符置于右边被称作后缀模式。例如: i++ i--;
4)前缀模式:
#include <stdio.h>
int main()
{
int a, b;
a = 10;
b = 10;
printf("%d %d\n", ++a, --b);
printf("%d %d\n", a, b);
return 0;
}
a)前缀模式表达式结果:
++ 与右运算对象构成前缀自增表达式,表达式结果为运算对象值加1;
- - 与右运算对象构成前缀自减表达式,表达式结果为运算对象值减1;
b)前缀模式对运算对象的操作:
自增表达式:将运算对象加1;
自减表达式:将运算对象减1;
5)后缀模式:
#include <stdio.h>
int main()
{
int a, b;
a = 10;
b = 10;
printf("%d %d\n", a++, b--);
printf("%d %d\n", a, b);
return 0;
a)后缀模式表达式结果:
++ 与左运算对象构成后缀自增表达式,表达式结果为运算对象值;
-- 与左运算对象构成后缀自减表达式,表达式结果为运算对象值;
b)后缀模式对运算对象的操作:
自增表达式:将运算对象加1;
自减表达式:将运算对象减1;
知识点十:一元运算符,二元运算符
1)一元运算符:只有一个运算对象的运算符。例如:自增运算符 ++ ,自减运算符 -- ;
2)二元运算符:有两个运算对象的运算符。例如:赋值运算符 = ,加法运算符 +;
知识点十一:运算符优先级
*C语言的四则运算符优先级和数学中的一致。先算括号里面的,先乘除后加减;
#include <stdio.h>
int main()
{
int a, b;
a = 10 * 2 + 4 * 3;
b = 10 * (2 + 4) * 3;
printf("%d %d", a, b);
return 0;
}
标记 | 操作符 | 类型 | 优先级 |
++ -- | 自增,自减 | 前缀 | 16 |
++ -- | 自增,自减 | 后缀 | 15 |
+ - | 正号,负号 | 单目 | 15 |
* / % | 乘,除,取余 | 双目 | 13 |
+ - | 加,减 | 双目 | 12 |
= | 赋值 | 双目 | 2 |
优先级越高的,在运算里面,需要被优先处理。例如:乘除优先级为13大于加减的12