C C++最全C语言操作符大全(建议收藏)_,阿里三面

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

解题思路:得到二进制下的每一位,如果是1,计数器count+1,最后count的值是二进制中1的个数

如何得到二进制中的每一位

  1. 通过&1,我们可以得到二进制中的最低位
  2. 再配合右移(>>),即可将二进位的每一位都得到
#include<stdio.h>

int main()
{
	int a = 0;
	while ((scanf("%d", &a)) != EOF)//多组测试用例,方便测试
	{
		int count = 0;

		for (int i = 0; i < 32; ++i)
		{
			if ((a >> i) & 1)
			{
				++count;
			}
		}
		printf("%d的二进制的1的个数:%d\n", a, count);
	}
	return 0;
}

在这里插入图片描述

4.2^的应用 – 不创建临时变量,交换两个数

根据相同为0,相异为1,^有这样的性质

性质1:0与一个数异或,得到的是这个数

0 ^ a = a

性质2:一个数与其本身异或,得到0

a ^ a = 0

性质1和性质2结合:

a ^ a ^ b = 0

b ^ b ^ a = 0

性质3:^具有交换律

a ^ b = b ^ a

所以可以得到:

a ^ b ^ a = b

a ^ b ^ b = a

即我们可以将a ^ b看成一个密匙,将密匙与a进行 ^运算得到b,将密匙与b进行 ^运算得到a

#include<stdio.h>

int main()
{
	int a = 3;
	int b = 5;
	a = a^b;//a此时变成密匙
	b = a^b;//密匙 ^ b = a b此时变成a
	a = a^b;//密匙 ^ a = b a此时变成b

	printf("%d %d\n", a, b);
	return 0;
}

5.赋值运算符

= – 将右操作数赋给做操作数

例如:

int a = 10;
int x = 0;
int y = 20;
//也可以连续赋值
a = x = y+1;//从右向左赋值
//效果等价于
x = y+1;
a = x;

符合赋值符

+=
    +=效果举例:
    int x = 10;
	x = x+10;
	等价于:
    x += 10;//复合赋值
-=
\*=
/=
%=
>>=
<<=
&=
|=
^=

6.单目操作符
!           逻辑反操作
-           负值
+           正值 -- +a -- 对a不做任何处理
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
\*           间接访问操作符(解引用操作符)
(类型)       强制类型转换

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 7;
	printf("!%d = %d\n", a, !a);
	printf("!%d = %d\n", b, !b);


	printf("&a = %p\n", &a);
	printf("&b = %p\n", &b);

	printf("%u\n", sizeof(int));
	printf("%u\n", sizeof(a));
	printf("%u\n", sizeof a);//true
	//printf("%u\n", sizeof int); //error sizeof后面不接括号,不能接类型名,但是可以接变量名
	
    printf("%d\n",~0);//-1 -- 二进制的每一位按位取反
	return 0;
}

6.1前置,后置的++ –

前置:先使用,再++ –

后置:先++ – ,再使用

前置:

#include<stdio.h>

int main()
{
	int a = 10;
	//后置++
	int b = a++;//先执行b = a ,再执行a++

	printf("%d\n", b);//10

	printf("%d\n", a);//11
	return 0;
}

#include<stdio.h>

int main()
{
	int a = 10;
	//后置++
	int b = ++a;//先执行a++,后执行b = a

	printf("%d\n", b);//11

	printf("%d\n", a);//11
	return 0;
}

6.2sizeof和数组
#include <stdio.h>

void test1(int arr[])
{
	 printf("%d\n", sizeof(arr));//(2)
}

void test2(char ch[])
{
 	printf("%d\n", sizeof(ch));//(4)
}

int main()
{
     int arr[10] = {0};
     char ch[10] = {0};
     printf("%d\n", sizeof(arr));//(1)
     printf("%d\n", sizeof(ch));//(3)
     test1(arr);
     test2(ch);
     return 0;
}

//(1) -- 40
//(2) -- 10
//(3) -- 4/8
//(4) -- 4/8

在函数调用test1test2中,传过去的arrch数组名,是首元素地址的意义,即形参接收实参其实只是一个指针变量来接收,指针变量的大小只与平台有关,与类型无关

7.关系操作符
>
>=
<
<=
!=   	用于测试“不相等”
==      用于测试“相等” -- 注意是两个等号

8.逻辑操作符
&&     逻辑与
||     逻辑或

&& 和 ||的理解有很多种

  1. 有些同学理解成botheither
  2. 有些同学理解成并且/都或者
  3. 有些同学理解成电路中的串联并联

大家用适合自己理解的去理解即可

在这里插入图片描述

举例1:

#include<stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	if (a && b)
	{
		printf("你们两都来啦\n");
	}
	else
	{
		printf("你们两怎么没都来");
	}
	return 0;
}

int main()
{
	int a = 0;
	int b = 0;
	if (a || b)
	{
		printf("你们两至少有一个来了\n");
	}
	else
	{
		printf("你们两怎么没有一个人来\n");
	}
	return 0;
}

举例2:



int main()
{
	int age = 0;
	printf("请输入你的年龄\n");
	scanf("%d", &age);
	//if (18 <= age <= 36)//逻辑相差很大
    if (age >= 18 && age <= 36)
	{
		printf("你是青年\n");
	}
	else
	{
		printf("你不是青年\n");
	}
	return 0;
}

这里比较容易错,大家如果想要表示一个18-36的范围,千万不要像数学中一样直接来一手18 <= age <= 36,这是一个错误的逻辑,&&是一个二元操作符,一次只能进行两个操作数的操作,无法达到我们一次到位的效果

正确写法: if (age >= 18 && age <= 36)


8.1&& 与 ||的短路问题

360笔试题

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

修改:

#include <stdio.h>
int main()
{
    int i = 1,a=0,b=2,c =3,d=4;
    i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

短路条件:

&&:当遇到假时,后面的表达式便不再执行

||:当遇到真时,后面的表达式便不再执行

9.条件操作符

​ 下面的图片可以大致解释条件表达式的意思

龟龟小故事:小明和小刚同时爱上了小红,小红也不知道怎么选择,于是绝对让小明和小刚做一个竞争,

小明赢了,那么小红就选择小明,小明输了(小刚赢了),小红就选择小刚

在这里插入图片描述

在这里插入图片描述

代码举例:

#include<stdio.h>

int main()
{
	int a = 3;
	int b = 10;
	int c = a > b ? a : b;
	printf("c = %d\n", c);
	return 0;
}

上述代码中,如果 a > b,则c = a,否则 c = b


正经解释:

条件表达式也叫做三目表达式,因为操作数有三个

exp1?exp2:exp3,如果exp1表达式的值为真,那么整个表达式的值就是exp2的值,否则整个表达式的值就是exp3的值

所以我们的求两数的最大值的函数可以稍微改善一下了:

改善前:

int Max(int x, int y)
{
	if (x > y)
	{
		return x;
	}
	else
	{
		return y;
	}
}

改善后:

int Max(int x, int y)
{
	return x > y ? x : y;
}


龟龟小故事的结局与条件表达式无关😅
由于龟龟故事的结局有一点点大转变,审核警告我说我有点狂,所以大家可以去我仓库看龟龟小故事结局

10.逗号表达式
exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

ps:由于逗号表达式是所有表达式中,优先级最低的,咱们尽量加上括号

(exp1, exp2, exp3, …expN)

#include<stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int c = (a>b, a = b + 10, a, b = a + 1);
	printf("%d\n", c);
	return 0;
}

###11下标引用、函数调用和结构成员

  • [] – 下标引用操作符

语法:数组名 + [下标]

操作数:数组名 + 下标值

#include<stdio.h>

int main()
{
    int arr[10];//创建数组
     arr[9] = 10;//实用下标引用操作符。
     //[ ]的两个操作数是arr和9。
    printf("%d\n",arr[9]);
    return 0;
}

  • () – 函数调用操作符

语法: 函数名 + (n个函数参数)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

nt c = (a>b, a = b + 10, a, b = a + 1);
printf(“%d\n”, c);
return 0;
}


 


###11下标引用、函数调用和结构成员


* `[]` – 下标引用操作符



> 
> 语法:数组名 + [下标]
> 
> 
>



> 
> 操作数:数组名 + 下标值
> 
> 
> 



#include<stdio.h>

int main()
{
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
//[ ]的两个操作数是arr和9。
printf(“%d\n”,arr[9]);
return 0;
}


 


* `()` – 函数调用操作符



> 
> 语法: 函数名 + (n个函数参数)
> 
> 
>



> 


[外链图片转存中...(img-ol0dP9Ls-1715692024619)]
[外链图片转存中...(img-KMC955GX-1715692024619)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值