码迷,mamicode.com
首页 > 其他好文 > 详细

6.C运算符

时间:2018-08-12 18:44:36      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:ble   print   显示   相加   为什么   有符号   个数   大于等于   执行   

//c运算符
/*
运算符是一种告诉编译器执行特定的数学或者逻辑操作的符号,c语言提供的操作符如下:
1.算数运算符
2.关系运算符
3.逻辑运算符
4.位运算符
5.赋值运算符
6.杂项运算符
*/

//1.算数运算符
/*
假设a的值为20,b的值为10
+ 把两个操作数相加   结果:A+B=30
- 把两个操作数相减	 结果:A-B=10
* 把两个操作数相乘	 结果:A*B=200
/ 把两个操作数相除   结果:A/B=2
% 去两个操作数的余数 结果:A%B=0
++自增运算符,+1     结果:A++将得到21
--自减运算符,-1     结果:A--将得到19
*/
#include <stdio.h>
int main01()
{
	int a = 20;
	int b = 10;
	int c;
	c = a+b;
	printf("a+b=%d\n", c); // a+b=30
	c = a-b;
	printf("a-b=%d\n", c); // a-b=10
	c = a*b;
	printf("a*b=%d\n", c); // a*b=200
	c = a/b;
	printf("a/b=%d\n", c); // a/b=2
	c = a%b;
	printf("a%%b=%d\n", c); //a%b=0
	c = a++;
	printf("a=%d, c=%d\n", a,c); // a=21, c=20 为什么会是这个结果下面再说
	c = b--;
	printf("b=%d, c=%d\n", b,c); // b=9, c=10  同上
}

//关于a++和++a之间的区别
//c = a++表示先将a的值赋给c,再对a进行自增
//c = ++a表示先对a进行自增,再将自增之后的a赋给c
int main02()
{
	int a=10;
	int c;
	c = a++;
	printf("c=%d\n", c); //c=10
	
	a = 20;
	c = ++a;
	printf("c=%d\n", c); //c=21
	//可以看到上面c的值,并没有变,因为在自增之前已经将值赋给c了
	//下面的值变了,因为是先自增,再赋值
}


//2.关系运算符
/*
假设a的值为20,b的值为10
==  判断两个操作数是否相等    a==b不为真
!=  判断两个操作数是否不相等  a!=b为真
>   判断左值是否大于右值      a>b为真
<   判断左值是否小于右值	  a<b不为真
>=  判断左值是否大于等于右值  a>=b为真
<=  判断左值是否小于等于右值  a<=b不为真
*/
int main03()
{
	int a=20;
	int b=10;
	if (a==b)
	{
		printf("a==b\n");
	}
	else if (a>=b)
	{
		printf("a>=b\n");  //a>=b
	}
	else
	{
		printf("a<b\n");
	}
}

//3.逻辑运算符
/*
&&  逻辑与运算符,左右都为真才为真
||   逻辑或运算符,左右只要有一个为真,就为真
!   逻辑非运算符,如果为真那么加上!就为假
*/
int main04()
{
	if (2>1 && 3>2)
	{
		printf("2>1 && 3>2为真\n"); //2>1 && 3>2为真
	}
	if (2>1 && 2>3)
	{
		printf("2>1 && 2>3为真\n");
	}
	if (2>1 || 2>3)
	{
		printf("2>1 || 2>3为真\n");  //2>1 || 2>3为真
	}
	if (1>2 || 2>3)
	{
		printf("1>2 || 2>3为真\n");
	}
	if (!(2>3))
	{
		printf("!(2>3)为真\n");  //!(2>3)为真
	}
}


//4.位运算符
/*
位运算符作用于位,并逐位进行操作
p	q	p & q	p | q	p ^ q
0	0	  0	      0	      0
0	1	  0	      1	      1
1	1	  1	      1	      0
1	0	  0	      1	      1
&:都为1,结果才为1
|:有一个为1,结果就为1
^:相同为0,相异为1

假设A=60,B=13,用二进制表示就是
A = 0011 1100
B = 0000 1101
--------
A & B = 0000 1101 = 12
A | B = 0011 1101 = 61
A ^ B = 0011 0001 = 49
对于任意整数A,B 总有A|B = A&B + A^B
其实仔细一想也简单,A|B,是只要有1,那么结果就为1
A&B,是必须都为1,结果才为1,相较于A|B,可以为1的少了哪部分呢?对,就是相异的部分
A^B,相异才为1,那么相较于A|B,可以为1少了哪部分呢?对就是相同都为1的部分
所以A&B和A^B就是A|B的"全为1才为1"和"只有一个为1才为1"两部分

还有取反运算符~,按照二进制取反规则进行计算。
<< 左移运算符,表示将一个二进制数向左移,低位补0
>> 右移运算符,表示将一个二进制数向右移,低位溢出不要,高位补0
*/
int main05()
{
	unsigned int a=60;
	unsigned int b=13;
	printf("a&b=%d\n",a&b);  //a&b=12
	printf("a|b=%d\n",a|b);  //a|b=61
	printf("a^b=%d\n",a^b);  //a^b=49
	printf("~a=%d\n",~a);    //~a=-61
	printf("a<<2=%d\n",a<<2);//a<<2=240
	printf("a>>2=%d\n",a>>2);//a>>2=15
}
//a<<n,将a左移n位,就相当于a * 2**n
//a>>n,将a右移n位,就相当于a / 2**n 
//但是a=60,为什么~a=-61,难道不应该是-60吗?这就要从计算机对数字的存储方式说起了
/*
我们知道计算机是以二进制方式存储数据的
a = 60,在计算机中60的形式就是0011 1100
显示是以原码显示,但在运算的时候是以补码运算的。
正数:原码=反码=补码
负数:原码=反码的符号位不变,其他位取反。补码=反码+1
	  如果从补码求原码,反码=补码符号位不变,其他位取反。原码=反码+1。
	  记住,+1永远针对于反码来的,所以这里是+1,而不是-1。
对于负数:说明是有符号类型,那么最高位表示的是正负号,为1则是负数,为0则是正数
a = 0011 1100,那么~a = 1100 0011,注意此时还是补码,运算是以补码运算的。
但显示要转化成原码显示,1100 0011先转换成反码(最高位不变,其他位取反)得到1011 1100,
反码1011 1100 + 1得到原码,1011 1101。
因此a的原码是0011 1100
~a的原码是1011 1101,最高位表示符号位,为1表示负数。
可以看到~a比a多了1,加上最高位的符号位,所以是-61
*/

//5.赋值运算符
/*
=	简单的赋值运算符,把右边操作数的值赋给左边操作数	                C = A + B 将把 A + B 的值赋给 C
+=	加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数	C += A 相当于 C = C + A
-=	减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数	C -= A 相当于 C = C - A
*=	乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数	C *= A 相当于 C = C * A
/=	除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数	C /= A 相当于 C = C / A
%=	求模且赋值运算符,求两个操作数的模赋值给左边操作数	                C %= A 相当于 C = C % A
<<=	左移且赋值运算符	    C <<= 2 等同于 C = C << 2
>>=	右移且赋值运算符	    C >>= 2 等同于 C = C >> 2
&=	按位与且赋值运算符	    C &= 2 等同于 C = C & 2
^=	按位异或且赋值运算符	C ^= 2 等同于 C = C ^ 2
|=	按位或且赋值运算符	    C |= 2 等同于 C = C | 2
*/
int main06()
{
	int a=20;
	int c;
	c = a;
	printf("c=%d\n", c);  //c=20
	c += a;
	printf("c=%d\n", c); //c=40, c = c+a,所以是40
	c -= a;
	printf("c=%d\n", c); //c=20, c = c-a,所以40-20=20
	c *= a;
	printf("c=%d\n", c); //c=400, c=c*a,所以20*20=400
	c /= a;
	printf("c=%d\n", c); //c=20, c = c/a ,所以400/20=20
	
	c = 210;
	c %= a;
	printf("c=%d\n", c); //c=10, 210%20=10
	c <<= 2;
	printf("c=%d\n", c); //c=40, 10* 2**2 = 40
	c >>= 2;
	printf("c=%d\n", c); //c=10, 40/ 2**2 = 10
	c &= 2;
	printf("c=%d\n", c); //c=2, 10 & 2 --->0000 0110 & 0000 0010 = 0000 0010 = 2
	c ^= 2;
	printf("c=%d\n", c); //c=0, 2 ^ 2 --->0000 0010 ^ 0000 0010 = 0000 0010 = 0
	c |= 2;
	printf("c=%d\n", c); //c=2, 0 | 2 --->0000 0000 | 0000 0010 = 0000 0010 = 2
}

//6.杂项运算符,sizeof & 三元运算符
/*
sizeof()	返回变量的大小。	sizeof(a) 将返回 4,其中 a 是整数。
&	        返回变量的地址。	&a; 将给出变量的实际地址。
*	        指向一个变量。	    *a; 将指向一个变量。
? :	条件表达式	如果条件为真 ? 则值为 X : 否则值为 Y
*/
int main()
{
	int a=4;
	short b;
	double c;
	int *p;
	printf("sizeof(a)=%d,sizeof(b)=%d,sizeof(c)=%d,sizeof(p)=%d\n", sizeof(a),sizeof(b),sizeof(c),sizeof(p));
	//sizeof(a)=4,sizeof(b)=2,sizeof(c)=8,sizeof(p)=4
	//可以看到int占4个字节,short占2个字节,double占8个字节,指针变量占4个字节
	
	//求两个数中较大的一个
	int m = 100;
	int n = 40;
	int max;
	if (m>n)
	{
		max = m;
	}
	else{
		max = n;
	}
	printf("max=%d\n", max); //max=100
	//还可以通过三元运算符
	max = (m>n)?m:n;
	printf("max=%d\n", max); //max=100
	//(m>n)?m:n,怎么理解呢?(m>n)?m,m大于n吗?大的话就是m,:n,不然就是n。
}


	

  

6.C运算符

标签:ble   print   显示   相加   为什么   有符号   个数   大于等于   执行   

原文地址:https://www.cnblogs.com/traditional/p/9463617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!