四则运算
加 +
减 -
乘 *
除 /
求余 %,就是求余数,求余不能作用于浮点数,只能作用于整型数
运算就有优先级,在C语言中也是先算乘除,后算加减,要改变优先级就用括号,先算括号内,后算括号内。
运算优先级:正负号> 乘除 >加减
关系运算
大于 >
小于 <
大于等于 >=
小于等于 <=
等于 ==
不等于 !=
比较两个值的大小关系
比较两个值是否相等
比较的结果不是对的就是错的,对的就是真,结果就是1;错的就是假,结果就是0.
运算优先级:大小比较 > 相等比较
程序示例1:
#include <stdio.h>
int main()
{
int a = 1;
int b = 0;
int c = a==b;//判断a与b是否相等,将结果赋值给c
printf("c = %d", c);
return 0;
}
显然输出结果是c = 0
程序示例2:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a - b > a + b; //判断a-b的结果是否大于a+b,将比较结果赋值给c
printf("c = %d", c);
return 0;
}
结果是c = 0
通过示例2,可以看出,关系运算符的优先级低于算术优先级,如果你不知道谁的优先级高,那就使用括号来确定优先级了,不丢人,如示例3所示。
程序示例3:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = (a - b) > (a + b); //判断a-b的结果是否大于a+b,将比较结果赋值给c
printf("c = %d", c);
return 0;
}
逻辑运算
逻辑与 &&
逻辑或 ||
逻辑非 !
所谓逻辑,非真既假,只要值等于0,那就是假,只要值不等于0,那就是真。1为真,2也为真。
逻辑与 &&,只要有一个条件为假,那结果就是假,所有的条件都为真,结果才是真:
0 && 0 结果为假(0)
0 && 1 结果为假(0)
1 && 0 结果为假(0)
1 && 1 结果为真(1)
逻辑或 ||,只要有一个条件为真,那结果就是真,所有的条件都为假,那结果就是假
0 || 0 结果为假(0)
0 || 1 结果为真(1)
1 || 0 结果为真(1)
1 || 1 结果为真(1)
逻辑非 !,这是一种单目运算符,所谓单目,就是只需要一个变量参与,如程序示例3所示,
程序示例3:
#include <stdio.h>
int main()
{
int a = 1;
int b = !a; //因为a=1,是真,!a就是假,所以b为假
int c = !b; //b为假,那!b就为真
printf("c = %d", c); //打印结果应该是 c = 1
return 0;
}
分析一个稍微复杂点的程序
程序示例4:
#include <stdio.h>
int main()
{
int a = 1;//a非0,为真
int b = 2; //b非0,为真
int c = 0; //c==0,为假
c = a && b; //真真相与,结果还是真
printf("c = %d\n", c); //打印结果应该是 c = 1
c = !(a - b) || (c < b);//a-b == -1,非0,为真,!(a - b)就为假,c<b,情况属实为真
printf("c = %d\n", c); //最终打印结果应该是 c = 1
c = -5; //-5非0,就是真
c = !!c; //双重否定,结果还是真
printf("c = %d\n", c); //打印结果应该是 c = 1
return 0;
}
位运算
位运算的相关概念:
1、所谓位运算,就是对数据的二进制位进行操作,就是对0和1进行操作;
2、位运算的操作数只能是整型数;
取反 ~ 优先级1 ~0101----> 1010
左移 << 优先级2 0011 << 1 ----> 0110(高位溢出,低位补0)
右移 >> 优先级2 0101 >> 2 ----> 0001(低位移出,高位补符号位)
与 & 优先级3 0111 & 1100 ----> 0100
异或 ^ 优先级4 0111^1100 ----> 1011(相同为0,不同为1)
或 | 优先级5 0111 | 1100---->1111
程序示例5:将整数5的第二位置1
5 = 0101,第二位置1,变成0111,相当于 5 | 2 ==0101 | 0010
#include <stdio.h>
int main()
{
printf("c = %d\n", 5|2); //0101 | 0010 == 0111 == 7
return 0;
}
程序示例6:将整数7的第四位取反
7 = 0111,第四位取反,变成1111,相当于0111 ^ 1000 = 1111
#include <stdio.h>
int main()
{
printf("c = %d\n", 7^8); //0111 ^ 1000 == 1111 == 15
return 0;
}
位运算的意义
位运算在嵌入式上用的非常多,比如将寄存器的某一位置0或者置1
就整型数据而言,为什么分int和short,它们的本质区别是什么?
1、占的内容大小不一样:short 占2个字节(16位),int占4个字节(32位)
2、表示数据的方式不同:正整数用源码表示,负整数用补码表示,整型数与浮点数的二进制表示方式也不一样。
所以进行位运算的时候需要确定几个问题:
1、操作输的类型,即占用内存的大小
2、操作数是正数还是负数
3、不同类型的数据进行位运算的时候需要先对齐
程序示例7:
#include <stdio.h>
int main()
{
short a = 1;
int b = 4;
int c;
c = a | b; // a先补符号位,变成0001,再与0100按位或
printf("c = %d\n", c);
return 0;
}
int型的-1在内存中是1111 1111 1111 1111 1111 1111 1111 1111
int型的1再内存中是0000 0000 0000 0000 0000 0000 0000 0001
其实字符型char 也可以理解为单字节的整型,取值范围-128--127,用作char类型时,就是字符,用作整型时,就是数字,具体可以看程序示例8:
程序示例8:
#include <stdio.h>
int main()
{
char c = 'A';
short a = c; //小类型可以转为大类型
int b = c;
printf("c = %c\n", c);
printf("c = %d\n", c);
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
打印结果是
c = A
c = 65
a = 65
b = 65
运算优先级从高到低排列
1、正负号 > 逻辑非 > 按位取反
2、乘除 > 加减 > 按位左右移
3、大小比较运算 > 相等比较运算
4、按位与 > 按位异或 >按位或
5、逻辑与 > 逻辑或
6、赋值操作
还是那句话,记不住优先级也没关系,用括号来区分,不丢人。
补充知识点
左值与右值:
赋值符号=左边的值叫左值,如变量;
赋值符号=右边的值叫右值,如变量、字面量