【操作符深入理解】

全网最接地气的C语言关于操作符的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,评论留下各自的见解,相互讨论。希望大家多多给予支持,赠人玫瑰,手有余香!

一:单引号与双引号

单引号是字符,双引号是字符串。
代码示例:

int main()
{
	printf("%dn", sizeof(1));  //**4**
	printf("%dn", sizeof("1"));  //**2**

	printf("%dn", sizeof('1')); //**4**
	//字符其实是一个整型。'a'叫做整型字符常量,被看成int型。

	char ch = '1';  **1**
	printf("%dn", sizeof(ch));

	system("pause");
	return 0;
}

4
2
4
1
请按任意键继续. . .

为什么会出现上述结果呢?
其实对于 ‘’ 1 ''而言是一个字符串,出了字符1外,还有一个,所以结果是2。
printf("%dn", sizeof(‘1’)); //4 这是因为字符其实是一个整型。'a’叫做整型字符常量,被看成int型。
printf("%dn", sizeof(ch));// 1 这是因为虽然字符是一个整型占4个字节,但是char只占一个字节,这其中发生了截断。

特殊情况:

	printf("%dn", sizeof(''));  // **报错**
	printf("%dn", sizeof("")); //  **1**

二:逻辑运算符

&&:级联多个逻辑表达式,必须同时为真,结果才为真。(与&按位与完全不同)
||:级联多个逻辑表达式,至少必须一个为真,结果才为真。

短路原理:

  1. 对于&&:多个逻辑表达式级联,从左到右只要有一个为假时,就不用继续往后计算了,整个为假。
  2. 对于||:多个逻辑表达式级联,从左到右只要有一个为真时,就不用继续往后计算了,整个为真。
int show()
{
	printf("you can see me!n");
	return 1;
}
int main()
{
	int a = 0;
	scanf("%d", &a);
	a == 10 && show();
	system("pause");
	return 0;
}

a == 10 && show(); 这部分代码相当于实现了if语句的判断功能。

三:位运算符

^ 操作符:

  1. 逐比特位,相同为0,不同为1;
  2. 支持结合律交换律
  3. 任何数与0异或,都等于本身。

这里我们还记得交换两个数字的经典代码,运用交换律与结合律就很好理解了。

int main()
{
	int x = 10;
	int y = 20;
	printf("before:%d %dn", x, y);

	x = x ^ y;
	y = x ^ y;
	x = x ^ y;

	printf("after:%d %dn", x, y);
	system("pause");
	return 0;
}

before:10 20
after:20 10
请按任意键继续. . .

在这里插入图片描述

按位或操作符:

按位或 | :按二进制位,同为0才为0,有1就出1;

//指定特定比特位位1:

#define SETBIT(x, n) ((x) |= (1 << (n - 1)))

void showbits(int x)
{
	int num = sizeof(x) * 8 - 1;
	while (num >= 0)
	{
		if (x & (1 << num))
			printf("1");
		else
			printf("0");
		num--;
	}
	printf("n");
}
int main()
{
	int x = 0;
	showbits(x);
	SETBIT(x, 5);
	SETBIT(x, 10);
	SETBIT(x, 20);
	SETBIT(x, 31);
	showbits(x);
	system("pause");
	return 0;
}


00000000000000000000000000000000
01000000000010000000001000010000
请按任意键继续. . .

按位与操作符:

& :级联多个数据,逐比特位进行位运算,同为1才出1,有0出0。

示例代码:
指定比特位为0

#define CLRBIT(x, n) ((x) &= (~(1 << (n - 1))))

void showbits(int x)
{
	int num = sizeof(x) * 8 - 1;
	while (num >= 0)
	{
		if (x & (1 << num))
			printf("1");
		else
			printf("0");
		num--;
	}
	printf("n");
}
int main()
{
	int x = 0xFFFFFFFF;
	CLRBIT(x, 5);
	CLRBIT(x, 10);
	CLRBIT(x, 20);
	CLRBIT(x, 31);
	showbits(x);
	system("pause");
	return 0;
}

10111111111101111111110111101111

四:移位操作符

如何理解丢弃:<< 或者 >> 都是计算,都要在CPU中进行,可是参与移动的变量,是在内存中的。
那么先要把数据移动到CPU内寄存器中,在进行移动,在实际移动过程中,是在寄存器中进行的,即大小固定的单位内,那么左移右移一定会有位置跑到外边。

左移操作符

移位规则:左边抛弃,右边补0;
在这里插入图片描述

右移操作符

移位规则:

  1. 逻辑移位:左边用0补充,右边丢弃。
  2. 算术移位:左边用符号位填充,右边丢弃。
    在这里插入图片描述
    对于无符号数右移:最低为丢弃,最高位补0(逻辑右移)。
    对于有符号数右移:最低为丢弃,最高位补符号位(算术右移)。

我们看一段代码:

int main()
{
	unsigned int a = 1;
	printf("%un", a << 1);
	printf("%un", a << 2);
	printf("%un", a << 3);

	unsigned int b = 100;
	printf("%un", b >> 1);
	printf("%un", b >> 2);
	printf("%un", b >> 3);

	int c = -1;
	printf("%dn", c >> 1);
	printf("%dn", c >> 2);
	printf("%dn", c >> 3);

	unsigned int d = -1;
	printf("%dn", d >> 1);
	printf("%dn", d >> 2);
	printf("%dn", d >> 3);
	system("pause");
	return 0;
}


2
4
8
50
25
12
-1
-1
-1
2147483647
1073741823
536870911

结论:
左移:无脑补0;
右移:先判断数的类型是有符号还是无符号,因此来判断是算术右移还是逻辑右移(和变量自身内容无关)。不管是什么类型,整数还是负数,内存中都是存的对应的二进制补码。

五:++,-- 操作符

我们都知道前置加加,前置减减与后置加加,后置减减的基本理解。
其实前置加加后置加加的区别在于有无变量接受对应的变化,当无变量接受时,前置与后置是一样的。

int main()
{
	int a = 0xdd;
	int b = a++;

	int c = 0xEE;
	c++;
	system("pause");
	return 0;
}

对于 a++,有b作为接收,那么是的先使用是将a的值放到b中。
对于c++,没有接收方。
结论:
a++的完整含义是先使用,再自增。如果没有变量接收,那么直接自增。

OK!!!观众老爷们,这里只是介绍了几个操作符,希望朋友们能够给予小菜一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>