说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
运算符与表达式
1) 常用运算符分类
运算符类型 | 作用 |
---|---|
算术运算符 | 用于处理四则运算 |
赋值运算符 | 用于将表达式的值赋给变量 |
比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
位运算符 | 用于处理数据的位运算 |
sizeof运算符 | 用于求字节数长度 |
2) 算术运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前自增 | a=2; b=++a; | a=3; b=3; |
++ | 后自增 | a=2;b=a++; | a=3; b=2; |
– | 前自减 | a=2; b=–a; | a=1; b=1; |
– | 后自减 | a=2; b=a–; | a=1; b=2; |
示例1: 加减乘除运算符
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
int c = a + b; // 30
int d = a - b; // -10
int e = a * b; // 200
printf("c=%d d=%d e=%d", c, d, e);
int f = b / a; // 2
int g = a / b; // 0 int a / int b 结果取整 为0
// 两个数相除,如果需要得到小数,那么这两个数就必须要有一个是double类型或者是float类型
double h = a / b; // 0.000000 a/b 得到int类型的0,将int 0 赋值给double变量h,所以结果按照double类型走
double i = a * 1.0 / b; //0.500000 double(8字节)类型和int(4字节)类型进行除法运算时,结果就会按照double类型走
printf("f=%d g=%d h=%lf i=%lf", f, g, h, i);
//int j = f / 0; //
//printf("j=%d", j); err 除数不能为0
return 0;
}
示例2: 取模(取余)运算符
#include<stdio.h>
int main() {
int num1 = 2;
int num2 = 3;
int num3 = 12345678;
int res1 = num1 % num2;
int res2 = num2 % num1;
printf("res1=%d\n", res1);// res1=2 除不尽 余数就为被除数
printf("res2=%d\n", res2); // res2=1
// 求num3的个十百千位
int gw = num3 % 10;
int sw = num3 / 10 % 10;
int bw = num3 / 100 % 10;
int qw = num3 / 1000 % 10;
printf("%d %d %d %d", gw, sw, bw, qw); // 8 7 6 5
return 0;
}
示例3: 前后自增运算符
#include<stdio.h>
int main() {
// a = a + 1 等同于 a++ 和 ++a
int a = 1;
// a = a + 1; // 2
// 如果 a++ 和 ++a 单独使用,效果相同都是 a = a + 1
//a++; // a = a + 1
//++a; // a = a + 1
int b = 0;
// ++ 在后面,a在前面,就会先将a的值赋给b,即b = a;然后再去执行a++,即a = a + 1
//b = a++; // b = 1 a = 2
// ++ 在前面,a在后面,就会先加++a,即a = a + 1;再赋值给b,即b = a
b = ++a; // b = 2 a = 2
printf("b=%d a=%d\n", b, a);
int c = 2;
printf("c=%d\n",c++); // 先打印(使用),再自加 c=2
printf("c=%d", ++c); // 先自加,再打印(使用) c=4
return 0;
}
示例4: 前后自减运算符
#include<stdio.h>
int main() {
// a = a - 1 等同于 a-- 和 --a
int a = 2;
// a = a - 1; // 1
// 如果 a-- 和 --a 单独使用,效果相同都是 a = a - 1
//a--; // a = a - 1
//--a; // a = a - 1
int b = 0;
// -- 在后面,先使用, 再自减 b = a, a = a - 1
//b = a--; // b = 2 a = 1
//-- 在前面,先自减, 再使用 a = a - 1, b = a
b = --a; // b = 1 a = 1
printf("b=%d a=%d\n", b, a);
int c = 2;
printf("c=%d\n", c--); // 先打印(使用),再自减 c=2
printf("c=%d", --c); // 先自减,再打印(使用) c=0
return 0;
}
3) 赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; | a=2; |
-= | 减等于 | a=5; a-=3; | a=2; |
*= | 乘等于 | a=2; a*=2; | a=4; |
/= | 除等于 | a=4; a/=2; | a=2; |
%= | 模等于 | a=3; a%2; | a=1; |
示例:
#include<stdio.h>
int main() {
// 加等于
int a = 1;
int b = 1;
a = a + 2; // a += 2
b += 2; // b = b + 2
printf("a=%d b=%d\n", a, b); // a=3 b=3
// 减等于
int c = 3;
int d = 3;
c = c - 2; // c -= 2;
d -= 2; // d = d - 2
printf("c=%d d=%d\n", c, d); // c=1 d=1
// 乘等于
int e = 4;
int f = 4;
e = e * 2; // e *= 2
f *= 2; // f = f * 2
printf("e=%d f=%d\n", e, f); // e=8 f=8
// 除等于
int g = 8;
int h = 8;
g = g / 2; // g /= 2
h /= 2; // h = h / 2
printf("g=%d h=%d\n", g, h); // g=1 h=1
// 模等于
int i = 5;
int j = 5;
i = i % 3; // i %= 3
j %= 3; // j = j % 3
printf("i=%d j=%d\n", i, j); // i=2 j=2
return 0;
}
4) 比较运算符
C 语言的比较运算中, “真”
用数字 “1”
来表示, “假”
用数字 “0”
来表示。
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
示例:
#include<stdio.h>
int main() {
int a = 3;
int b = 4;
printf("%d\n", a == b); // 0
printf("%d\n", a != b); // 1
printf("%d\n", a < b); // 1
printf("%d\n", a > b); // 0
printf("%d\n", a <= b); // 1
printf("%d", a >= b); // 0
return 0;
}
5) 逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真;如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
示例:
#include<stdio.h>
int main() {
// 非 ! 非0的数都为真
int a = 0;
int b = 1;
int c = -1;
printf("%d\n", !a); // 1
printf("%d\n", !b); // 0
printf("%d\n", !c); // 0
// 与 && A && B 必须A和B两个都为真,整个表达式才为真
printf("%d\n", a && b); // 0
printf("%d\n", a && c); // 0
printf("%d\n", b && c); // 1
printf("%d\n", !a && b); // 1
printf("%d\n", a && b++); // 0 // 当A表达式为假时,就不会去执行B表达式b++
printf("a = %d,b=%d\n", a, b); // a = 0,b=1
// 或 || A || B A和B只要有一个为真,整个表达式就为真
printf("%d\n", a || b); // 1
printf("%d\n", a || c); // 1
printf("%d\n", b || c); // 1
printf("%d\n", !b || a); // 0
printf("%d\n", b || a++); // 1 // 当A表达式为真时,就不会去执行B表达式a++
printf("a = %d,b=%d\n", a, b); // a = 0,b=1
return 0;
}
6) 运算符优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
() | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | -- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1?表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |
示例:
#include<stdio.h>
int main() {
int a = 1;
int b = 2;
int c = 0;
// += 和 *= 优先级都是14,那么当优先级一样,就看结合方向,从右到左运算
c += a *= 10; // a = a * 10; ,c = c + a;
printf("c=%d\n", c); // c=10
// c+++b; 分为两部分前面是 c++ 后面是 +b,而c++ ++在后面,那么c就先使用,即 c + b, c = c + 1
c++ +b;
printf("c=%d\n", c); // 11
// 逗号运算符,最终的结果是最后一个表达式的结果
int d = (a++, b++, a - b, a + b, 20, 300, a *= b, 0);
printf("d=%d\n", d); // 0
return 0;
}
7) 类型转换
数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。
转换的方法有两种:
- 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。
- 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。
类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。
7.1 隐式转换
#include<stdio.h>
int main() {
// 隐式转换
int a = 10;
double b = a;
printf("r1=%d\n", a / 4); // 2
printf("r2=%lf\n", a / 4.0); // 2.500000
printf("b=%lf\n", b); // 10.000000
return 0;
}
7.2 强制转换
强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式:(类型说明符)表达式
强制转换宗旨: 数据不丢失,为了保证数据不丢失一般都是小的转大的
#include<stdio.h>
int main() {
// 隐式转换
int a = 10;
double b = a;
printf("r1=%d\n", a / 4); // 2
printf("r2=%lf\n", a / 4.0); // 2.500000
printf("b=%lf\n", b); // 10.000000
// 所需要的类型和给的类型不匹配,就需要进行转换
//printf("%d\n", 3.14); // 1374389535 // %d要整型,但给的是3.14浮点型,所以出错了
// 强制转换 将需要转的类型括起来+原来的数据 即(int)3.14
printf("%d\n", (int)3.14); // 3
printf("%lf\n", (double)a); // 10.000000
int c = 20;
double d = (double)c; // 等号两边的数据类型尽量相同,不同时尽量去转换(编译器有些情况却不会进行转换)
printf("%lf\n", d); // 20.000000
return 0;
}