C语言学习:4、C语言的运算

四则运算

        加  +

        减  -

        乘  *

        除  /

        求余  %,就是求余数,求余不能作用于浮点数,只能作用于整型数

运算就有优先级,在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、赋值操作

还是那句话,记不住优先级也没关系,用括号来区分,不丢人。

补充知识点

左值与右值:

赋值符号=左边的值叫左值,如变量;

赋值符号=右边的值叫右值,如变量、字面量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值