一.各种运算符初览
1.算术运算符:
+(加) -(减) *(乘) /(除) %(取余)
2.自增自减运算符:
++(自增) --(自减)
3.赋值运算符:
=(赋值) +=(a+=b相当于a=a+b) -=(同上) *= /= %=
4.关系运算符:
==(判断是否相等) !=(判断两值是否不等) >(大于) >=(大于等于) <(小于) <=(小于等于)
5.逻辑运算符:
!(非) &&(与) ||(或)
6.a > b ? a : b(a大于b吗?如果大于,那么结果为a,如果小于等于b,那么最后结果为b)
注意点:
1.整数计算的结果一定是一个整数
2.小数计算的结果一定是一个小数
3.整数和小数计算最后得出的结果一定是一个小数
4.小数直接参与计算,结果是有可能不精确的
除法:
5.在除法中不能除以0
取余:
6.在取余时运算的数据必须全部都是整数
7.获取余数的正负是跟第一个数字保持一致的
8.不能对0取余
二.计算机中的隐式转换
在了解隐式转换之前,我们需要知道的一点是:在c语言中,两数如果要进行计算,必须是相同类型的
那么如果两个不同类型的数据进行计算了会怎样呢?
答案是编译器会把一个取值范围小的数据类型转成取值范围大的数据类型
1.隐式转换的两条规则:
(1).取值范围小的和取值范围大的计算时,小的会自动提升为大的,再进行计算
(2).short,char类型的数据在运算的时候先被提升为int类型再进行计算
2.各数据类型的取值范围:
char<short<int<long<long long<float<double
3.什么时候会触发隐式转换?
在不同的数据类型进行计算,赋值等操作的时候会触发隐式转换
三.强制转换
1.强制转换的应用场景:
如果要把取值范围大的赋值给取值范围小的,就需要进行强制转换
2.强制转换的使用方式:
目标数据类型 变量名 = (目标数据类型) 被强转的数据;
#include<stdio.h>
int main() {
int a = 100;
// 将int类型的a强制转换为了double类型的b
double b = (double) a;
}
3.强制转换的弊端:
可能导致数据错误
三.计算机中的加法运算
1.数字相加
2.字符相加:
之前提到过short,char类型的数据在运算的时候,先被提升为int再进行运算,那么它们能进行这样的运算的底层逻辑是什么呢?
我们需要了解ASCII码表的概念:
在ASCII码表中我们用二进制,十进制,十六进制的数字来表示一个数据
那么如同下方的代码所得出的结果是什么呢?
char a = 'a';
int ans = a + 1;
事实上,如果你查过a在ASCII码表中所对应的值就会发现,它对应的是数字97,也就是说最后ans输出的结果会是98
四.自增自减运算符
自增自减运算符都是既可以放在变量的前面,也可以放在变量的后面,但是放在前面和放在后面的效果是不一样的,下面是一段程序帮助大家理解放在前面和后面的区别:
#include<stdio.h>
int main() {
int ans = 10;
// 第一次输出的是10
printf("%d\n", ans++);
// 第二次输出的是12
printf("%d\n", ++ans);
/* 为什么会出现这样的结果呢?因为如果自增(自减)运算符放在变量之前,那么就会先计算值,再输出,放在之后则是先输出,
再计算值,也就是说一开始的ans输出了之后,再自增了1,之后先增加了1,再把一共加了2的ans输出
*/
}
1.自增(++)
2.自减(--)
3.注意:
(1).++和--所改变的值都是1
(2).自增(自减)写在变量的前后两种情况所得出的结果是完全不同的
(3).在单独写一行的情况下,无论是放在前或后,得出的结果都是一样的(改变了1)
(4).应用场景:在+1的计算与统计中
五.赋值运算符
除了=这种直接赋值方式,还有+=,-=,*=等等计算后赋值的方式,举个例子:
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
// a += b 其实就是a = a + b,其它的计算赋值方式也同理
a += b;
// 所以最后a的取值为30
}
六.关系运算符
==,!=,>等等判断变量是否相等(大于小于)等等
我们需要注意的是:在我们使用关系运算符时,最后返回的值要么为0,要么为1,如果返回的值是0,那么表示结果为假,为1则结果为真
举个例子:
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
// 最后的结果很明显是0,因为10是小于20的
printf("%d", a > b);
}
七.逻辑运算符
1.逻辑运算符的作用:
连接多个表达式
2.各个逻辑运算符
(1).&&表示与(而且),只有在两边都为真时,结果才为真
(2).||表示或(或者),只有在两边都为假的时候结果才为假
(3).!表示非(取反),对真取反则为假,对假取反则为真
举例:
#include<stdio.h>
int main() {
printf("%d\n", 1 && 1); //结果为1
printf("%d\n", 1 && 0); //结果为0
printf("%d\n", 0 && 0); //结果为0
printf("%d\n", 0 && 0); //结果为0
printf("%d\n", 1 && 1); //结果为1
printf("%d\n", 1 || 0); //结果为1
printf("%d\n", 0 || 1); //结果为1
printf("%d\n", 0 || 0); //结果为0
printf("%d\n", !1); //结果为0
printf("%d\n", !0); //结果为1
}
注意:在实际开发当中最多使用一个取反
八.三元运算符
1.使用格式:
关系表达式?表达式1: 表达式2;
2.举例:
#include<stdio.h>
int main() {
int a = 10;
int b = 20;
int c = a > b ? a : b; //若a大于b,则c=a,反之则c=b
printf("%d", c);
}
九.逗号运算符(分隔符)
1.运算规则:
(1).从左到右依次运算
(2).最后一个子表达式的结果是整个表达式的结果
(3).优先级最低(永远是最后执行)
2.举例:
#include<stdio.h>
int main() {
int ans = 5;
printf("%d", (ans++, ans+= 10)); //最后输出结果为16
}
十.运算符的优先级
1.规则:
(1).小括号优先于所有
(2).一元>二元>三元
(3).&&>||>赋值