目录
2.1.1 加(+)、减(-)、乘(*)、除(/)、模除(%)
一、概念
运算符是告诉程序执行特定的算术或逻辑操作的符号,运算符会连接多个表达式,所谓的表达式就是由运算符、运算量和标点符号等组成的有效的序列,是用来说明一个运算的过程的。
二、种类
2.1 算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模除运算,%)、自增(++)、自减(--)共七种。
2.1.1 加(+)、减(-)、乘(*)、除(/)、模除(%)
比较简单,跟常用的数学算术运算没有区别;
#include <stdio.h>
int main()
{
int m = 10;
int n = 20;
printf("m + n = %d\n", m+n);
printf("m - n = %d\n", m-n);
printf("m * n = %d\n", m*n);
printf("m / n = %f\n", (float)m/(float)n);//强转
printf("m %% n = %d\n", m%n);//输出% 需要使用 %%
return 0;
}
执行结果:
2.1.2 自增(++)、自减(--)
a++ / ++a 算术结果等同于 a = a+1;
a-- / --a 算术结果等同于 a = a -1 ;
注意:前缀的自增自减和后缀的自增自减是不一样的,使用时需要注意。
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;
printf("a = %d b = %d\n", a, b);
int x = 10;
int y = ++x;
printf("x = %d y = %d\n", x, y);
return 0;
}
运行结果:
① a = 10; b = a++;实现逻辑:第一步在空间中临时放置a 的值10,假设此空间名字为temp;第二步执行a = a+1;第三步将temp的值赋值给b。
②x = 10; y = ++x;实现逻辑: 第一步执行x = x+1; 第二步将x的值赋值给y。
2.2 关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
注意:关系运算符的判断相等是两个等号,一个等号是赋值运算符,关系运算符表达式的结果是一个 bool 类型,0 表示假 非0表示真。
#include <stdio.h>
int main()
{
int m = 20;
int n = 10;
if(m >= n){
printf("m >= n\n");
}else{
printf("m < n\n");
}
//其他的关系运算符用法 同理
return 0;
}
2.3 逻辑运算符
2.3.1包括 与(&&)、或(||)、非(!)三种。
逻辑运算符使用来连接由多个关系运算符组成的表达式的,逻辑运算符的表达式的结果也是 bool 类型。
#include <stdio.h>
int main()
{
int m = 20;
int n = 10;
if(m>0 && n>0){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}
2.3.2 逻辑运算符的短路原则:
逻辑与:逻辑与连接的多个表达式,遇到某个表达式为假,后面的表达式就都不执行了,因为这个假足以判断整个表达式为假。
逻辑或:逻辑或连接的多个表达式,遇到某个表达式为真,后面的表达式就都不执行了,因为这个真足以判断整个表达式为真。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
//因为 b<0 为假, 所以 ++c 不再执行了
if(++a && b<0 && ++c){
printf("yes\n");
}else{
printf("no\n");
}
printf("a = %d b = %d c = %d\n", a, b, c);//11 20 30
a = 10;
b = 20;
c = 30;
//由于 ++b 为真 所以 ++c 不再执行了
if(a<0 || ++b || ++c){
printf("yes\n");
}else{
printf("no\n");
}
printf("a = %d b = %d c = %d\n", a, b, c);//10 21 30
return 0;
}
上述代码执行结果:
2.4 位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
一般位运算都是无符号数参与运算,如果用有符号数,会涉及原码反码补码转换的问题。
& 按位与 :按位运算 全1为1 有0为0
| 按位或 :按位运算 有1为1 全0为0
^ 按位异或 :按位运算 不同为1 相同为0
~ 按位取反 :按位运算 1变0 0变1
<< 按位左移:整个数据向左移动 高位舍弃 低位补0
>> 按位右移 :整个数据向右移动 高位补0 舍弃低位
#include <stdio.h>
int main()
{
unsigned char a = 20;
unsigned char b = 33;
unsigned char c = 0;
//按位与 全1为1 有0为0
//a:0001 0100
//b:0010 0001
//&
//c:0000 0000
c = a&b;
printf("a&b = %#x\n", c);//0x00
//按位或 有1为1 全0为0
//a:0001 0100
//b:0010 0001
//|
//c:0011 0101
c = a|b;
printf("a|b = %#x\n", c);//0x35
//按位异或 相同为0,不同为1
//a:0001 0100
//b:0010 0001
//^
//c:0011 0101
c = a^b;
printf("a^b = %#x\n", c);//0x35
//按位取反
//a:0001 0100
//~
//c:1110 1011
c = ~a;
printf("~a = %#x\n", c);//0xEB
//按位左移
//a:0001 0100
// <<2
//c:0101 0000
c = a<<2;
printf("a<<2 = %#x\n", c);//0x50
//按位右移
//a:0001 0100
// >>2
//c:0000 0101
c = a>>2;
printf("a>>2 = %#x\n", c);//0x05
return 0;
}
2.5 赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+= , -= , *= , /= , %=)和复合位运算赋值(&= , |= , ^= , >>= , <<= )三类共十一种。
注意:
1.一个等号是赋值 两个等号是关系运算符判断相等
2. 左=右, 将右边的值赋值给左边
3.常量不允许放在等号的左边
2.6 条件运算符
这是一个三目运算符,用于条件求值(?:)。
格式:表达式1?表达式2:表达式3;
执行顺序:先执行表达式1,如果1的值为真则执行表达式2,否则执行表达式3;
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
int c = 30;
int d = 0;
d = ++a?++b:++c;
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
return 0;
}
执行结果:
2.7 逗号运算符
用于把若干表达式组合成一个表达式(,)。
格式:(表达式1, 表达式2, ..,表达式n)
执行逻辑:从左到右依次执行,每个表达式都会参与运算,最后一个表达式的结果,就是整个逗号运算符表达式的结果。
2.8 指针运算符
用于取内容(*)和取地址(&)二种运算。
本文不再详细描述,后续指针章节再聊。
2.9 求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
注意:sizeof()用法非常像函数调用,但是sizeof为运算符。
#include <stdio.h>
int main()
{
char a;
short b;
int c;
printf("sizeof(char) = %ld, sizeof(a) = %ld\n", sizeof(char), sizeof(a));
printf("sizeof(short) = %ld, sizeof(b) = %ld\n", sizeof(short), sizeof(b));
printf("sizeof(int) = %ld, sizeof(c) = %ld\n", sizeof(int), sizeof(c));
return 0;
}
上述代码执行结果:
2.10 特殊运算符
有括号(),下标[],成员(→,.)等几种。
三、 运算符优先级
单算移关与,异或逻条赋