来源:微信公众号「编程学习基地」
目录
运算符
算术运算符
运算符 | 举例 |
---|---|
+ | 加 a+b |
- | 减 a-b |
* | 乘 a*b |
/ | 除 a/b |
% | 求余 a%b |
加减和乘法运算符不必多说,我们来看看除法运算符和求余运算符
除法运算符
- 两个实数相除的结果为双精度实数,两个整数相除的结果为整数(一般向0取整)
例如:5/3 运行结果为1,舍去了小数部分
根据整数除法特性:四舍五入 设计方法
- 四舍五入到个位
#include<stdio.h>
int main()
{
float n = 1.525f; //float n = 1.425f;
printf("%d", (int)(n * 10 + 5)/10); //四舍五入到个位 输出为 2
return 0;
}
- 四舍五入到小数点后两位
#include<stdio.h>
int main()
{
float n = 1.525f;
printf("%f", (int)(n*100+0.5)/100.0); //四舍五入到小数点后两位
return 0;
}
- 当然也有函数可以实现四舍五入
<stdio.h>里面有个 round() 函数 将浮点值舍入为最接近的整数。
#include<stdio.h>
#include<math.h>
int main()
{
float n = 1.525f;
printf("%f", round(n)); //输出为 2.000000
return 0;
}
求余运算符
求余只能两个整数求余
利用求余得到整数的各个位数:水仙花数 算法
#include<stdio.h>
int main()
{
int i,n,m,l;
for(i=100;i<=999;i++)
{
n=i/100; //百位数
m=i%100/10; //十位数
l=i%10; //个位数
if(i==n*n*n+m*m*m+l*l*l) //判断水仙花数
{
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
关系运算符和逻辑运算符
关系运算符
关系运算符和逻辑运算符主要用在分支和循环里面作为条件判断真假
- 比较的结果有两种状态 1 和 0 真(1)和假(0)
关系运算符 | 举例 |
---|---|
> | 小于 1>2 为假,结果为0 |
< | 大于 1<2 为真,结果为2 |
>= | 大于等于 1>=2 为假,结果为0 |
<= | 小于等于 1<=2 为真,结果为1 |
== | 等于 1==2 为假,结果为0 |
!= | 不等于 1!=2 为真,结果为1 |
- 对于小数 浮点型数据不够精确 一般不用==
- 0.009<x<0.011 这种数学表达式就禁用了,要用逻辑运算符来连接
逻辑运算符
&& 逻辑与
- 左右两个条件都为真 最后的结果为真 否则(只要有一个为假) 结果为假
if(0.009<x&&x<0.011){} //这种就是正确的
|| 逻辑或
- 左右两边的条件只要有一个为真 结果为真 两边都为假 结果为假
if(x<0.009||x>0.011){}
!逻辑非
- 一般放在一个条件前面 真变假 假变真
关于用数字作为条件 0为假 非0为真
逻辑运算符的截断
- 逻辑与 两边都为真 结果为真
- 左边为假 直接得到整个式子的结果为假(右边可以不用算)
#include<stdio.h>
int main()
{
int x=1;
if(0&&(++x)){}
printf("%d",x); //结果为1 即++x这个代码未执行
return 0;
}
- 逻辑或 左边为真 右边可以不用算(截断)
位运算符(二进制运算符)
学C语言很少用到二进制,但是,我们需要了解他
-
按位与 &
-
对一个二进制数字操作:有0则0
14&89 14二进制:1110 89二进制:0101 1001
0000 1110
0101 1001
按位与 0000 1000
结果为:0000 1000(二进制),10(十进制)
-
按位或 |
-
对一个二进制数字操作:有1则1
按位异或 ^
- 对一个二进制数字操作:相同为0不同为1
按位取反~
- 对一个二进制数字操作:1变0 0变1
~14 14二进制:0000 1110
0000 1110
按位取反 1111 0001
-
左移 <<
-
x<<n 去掉前面的n位 后面补上n个0
14<<2 14二进制:0000 1110
0000 1110
0011 1000
左移补0 结果为0011 1000
-
右移 >>
-
x>>n 去掉后面的n位 前面补上n个符号位(正数前面补0 负数前面补1)
对于一个正整数 右移一位相当于除以2
异或 ^
- 特点:对于同一个数字异或两次会得到它本身
14^87^87==14
-
异或的用法
-
简单的加密
z=x^y 对x进行加密
a=z^y 对z进行解密
交换两个变量的值
//利用临时变量交换
int temp;
temp=x;
x=y;
y=temp;
//利用异或
x=x^y;
y=x^y;
x=x^y;
//用加减法
x=x+y; //对于x和y比较大的时候 x+y可能超过int范围
y=x-y;
x=x-y;
赋值运算符
把一个值赋值给一个变量: 左值 = 右值 把右值赋值给左值
x=4; //4这个值赋值给x这个变量
- 左值 只能是变量
- 右值 可以是数字 表达式(1+2)
条件运算符(三目运算符)
条件 ? 表达式1 : 表达式2
//求两个数的最大值
max=a>b?a:b;
其他运算符
() 括号运算符
- 改变计算顺序(优先级)
- 类型转换
(float)3/4:
类型转换存在的问题:精度高的数据 转换成精度低的数据 可能会丢失数据
类型 char int float double 精度由低到高
(int)(3.14+0.5) 小数强转整数 小数部分全部丢掉
++ --自增和自减
后++
先运算,再自增
int x,y;
x=0;
y=x++; //先用x之前的值进行计算 然后 再给x变量加1
//结果y=0,x=1
前++
先自增,再运算
int x,y;
x=0;
y=++x; //先给x变量加1,再进行计算
//结果y=1,x=1
前加加,后加加探讨(小白勿看)
#include<stdio.h>
int main()
{
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d", p, q, i, j);
return 0;
}
输出结果:15,24,8,8
VC6.0显示结果为15,22,8,8
这个是编译器的问题,不做深究
- 这个涉及到 前加加先自增,再运算;后加加先运算,再自增 这一特性
#include<stdio.h>
int main()
{
int i = 8;
//输出 i
printf("%d\t", ++i); //i先加一在输出 9 9
printf("%d\t", --i); //i先减一再输出 8 8
printf("%d\t", i++); //i输出再加一 8 9
printf("%d\t", i--); //i输出再减一 9 8
printf("%d\t", -i++); //i输出再加一 -8 9
printf("%d\t", -i--); //i输出再减一 -9 8
printf("\n-----------------\n");
i = 8;
printf("%d\t%d\t%d\t%d\t%d\t%d\n", ++i, --i, i++, i--, -i++, -i--);
return 0;
}
//运行结果
9 8 8 9 -8 -9
-----------------
8 7 8 8 -8 -8
- 这又涉及到C的特性:语句编译时从右往左
& 取地址
- scanf("%d",&a);
sizeof
- 计算变量/类型的大小
- sizeof(int)
逗号运算符
- 隔开几个表达式
int x;
x=1,2,3+4,5,7; x最后的值是1
其他
- [] 下标运算符
- . 点运算
- -> 箭头运算符
- *指针运算符
- () 函数
- {}语句
其他后面介绍
优先级
-
这个不需要记,需要用的时候查表就可以
-
从上到下优先级降低
-
不清楚优先级顺序加()