5.C语言运算符

1算数操作符

算数操作符: + - * / %
①除了%操作符之外,其余操作符均可用于整数和浮点数
②/如果操作符两边都是整数,结果是整数;如果操作数有一边是浮点数,结果是浮点数
③%操作符两边都必须是整数,返回的的整除之后的余数

2移位操作符

①左移:<<
二进制:0000 1011(11)
左移一位:0001 0110(22)=(11*(2^1))
左移两位:0010 1100(44)=(11*(2^2))
结论:a)左移1位左边第一位舍去,最右边补0
b)左移相当于乘法,左移n位=原数*(2^n)

②右移:>>
二进制:0000 1011(11)
右移一位:0000 0101(5)==(11/(2^1))
右移两位:0000 0010(2)=(11/(2^2))
结论:a)右移1位右边第一位舍去,最左边正数补0,负数补1
b)右移相当于除法,左移n位=原数/(2^n)

移位不能移负数位,比如左移-1位

3位操作符

①&按位与
两个相同是1
②|按位或
有一个是1就是1
③^按位异或
两个相同就是0,不相同就是1

原码,反码,补码
求反码:符号位不变,其他位取反
补码:符号位不变,在反码的基础上加1
二进制正数符号位是0,负数时1

//求一个数中二进制中1的个数
 int NumOfOne1(int num)
 {
	 int count=0;
	 int i =0;
	 for(i=0;i<32;i++){
		 if(((num>>i)&1)==)
		 {
			 count ++;
		 }
 }
 }
 int NumofOfOne2(int num)
 {
	 int count =0;
	 int i =0;
	 for(i =1;i<=32;i++){
	 if(num!=0)
	 {
		 count ++;	
		num=num&(num-1);
	 }
	 return count;
 }
 }

4赋值操作符

4.1赋值符

赋值操作符就是1个=
左值=右值
左值要可以容纳右值

4.2复合赋值符

①+=
②-=
③*=
④/=
⑤%=
⑥>>=
⑦<<=
⑧|=
⑨&=
⑩^=

5单目操作符

在这里插入图片描述
①++
前置++,先++后使用
后置++,先使用后++

单独使用没有区别,只有赋值的时候有区别
②sizeof
a)sizeof在编译期间确定表达式字节的大小

int main()
{
	int arr[6]={1,2,3,4,5,6};
	printf("%d\n",sizeof(arr[5]));//4
	int i = 10;
	printf("%d\n",sizeof(++i));//4;sizeof在编译期间判断++i是整型,不会++i运算
	printf("%d\n",i);//10;sizeof在编译期间判断++i是整型,不会++i运算
	printf("%d\n",sizeof(1+3.5));
	printf("%d\n",sizeof(1+3.5f));
	return 0;
}

b)

void test(int arr[])
{
	printf("%d\n",sizeof(arr));//数组在数组传参的时候,数组名代表首元素的地址
}
void test2(char ch[])
{
	printf("%d\n",sizeof(ch));
}
int main()
{
	int arr[10]={0};
	char ch[10]={0};
	printf("%d\n",sizeof(arr));//40;sizeof(arr):arr数组名代表整个数组
	printf("%d\n",sizeof(ch);
	test1(arr);
	test2(ch);
	return 0;
}

c)任何指针类型都是存放地址,地址都是4个字节大小

int main()
{

	printf("%d\n",sizeof(int *));//4
	printf("%d\n",sizeof(char *));//4
	printf("%d\n",sizeof(short *));//4
}

6关系操作符

=
<
<=
!=
==

7 逻辑操作符

&&
||

int main()
{
	int i =0,a=0,b=2,c=3,d=4;
	i =a++&&++b&&d++;//a++先使用后加加,a使用的时候为0,短路与后面的就不执行,所以bcd不变,使用完之后++所以a是1
	x =a++||++b||d++;
	printf("a=%d\n b=%d\n c=%d\n d=%d\n");
	return 0;
}

短路与:如果&&左边为假的话,右边就不会执行,为真右边执行
短路或:如果||左边为假的话,右边执行,为真不执行

int main()
{
	int a = 1;
	int b=0;
	int c =2;
	if(a++&*b++&&c++)
	{
		printf("hhh\n");
	}else
	{
		printf("xxx\n");
	}
	printf("%d,%d,%d\n",a,b,c);
}

8 条件操作符

exp1 ?exp2:exp3

9逗号表达式

用逗号隔开多个表达式,把所有的执行完,以最后一个结果为准

int main()
{
	int a = ( 1, 2, 3, 4, 5 );
	printf("%d\n", a);//5
	return 0;
}

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

10.1[]下标引用操作符

操作数:一个数组名+一个索引值

int arr[10];//创建数组;[]创建数组不是下标引用
arr[9]=10;//引用下标引用操作符;操作数是arr和9

10.2()函数调用操作符

#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n",str);
}
int main()
{
test1();//()作为函数调用操作符
test2("hello bit.");
return 0;
}

11隐式类型转换

11.1整型提升

整型提升:为获取精度,表达式中的字符和短整型在使用之前被转换为整型,使得CPU方便计算

int main()
{
char a =1;//1是int 类型的有32位,但是char是8位的所以就会把多余的0舍弃
char b =2;
char c = a+b;//在进行计算的时候会进行整型的提升,正数补0,负数补1
printf("%d\n",c);
return 0;
}
int main()
{
char c =1;
printf("%u\n",sizeof(c));//1
printf("%u\n",sizeof(+c));//4,只要有运算就会发生整型提升
printf("%u\n",sizeof(!c));//4
return 0;
}

11.2算数转换

如果某个操作符的的操作数属于不同的类型,除非其中一个发生转成另外一个操作数类型,否则操作无法进行

long double 
double 
float
unsigned long int 
long int 
unsigned int 
int
//下面的会强制转换成上面的数据类型

11.3操作符的属性

影响表达式求值的三个因素:①操作符的优先级②操作符的结合性③是否控制求职的顺序

表达式的优先级可以控制,比如乘号先于加号,但是不能控制乘号左边先算还是后边先算

练习

①两个整数二进制序列有多数位不同

int Fun(int num1, int num2)
{
	int tmp = num1^num2;
	int count = 0;
	while (tmp != 0)
	{
		count++;
		tmp = tmp&tmp - 1;
	}
	return count;
}
int main()
{
	printf("%d\n", Fun(7, 18));
	return 0;
}

②返回一个数二进制序列中奇数位和偶数位

void Print(int n)
{
	int i = 0;
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d", (n >> i) & 1);
	}
	printf("\n");
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d", (n >> i) & 1);
	}
}
int main()
{
	Print(7);
	return 0;
}

③五名学生竞赛,他们预测结果为
张三说,张四第二,我第三
张四说,我第二,张七第四
张五说,我第一,张六第二
张六说,张五最后,我第三
张七说,我第四,张三第一
比赛结束后每名学生都才对一半,请得出竞赛结果

void Fun()
{
	int a=0;
	int b = 0;
	int c = 0;
	int d= 0;
	int e = 0;
	for (a = 1; a <= 5; a++)
	{
		for (b = 1;  b<= 5; b++)//五名学生分别有五种可能
		{
			for (c= 1; c <= 5; c++)
			{
				for (d= 1; d <= 5; d++)
				{
					for (e = 1; e <= 5; e++)
					{
						if (((b == 2) + (a == 3) == 1) &&
							((b == 2) + (e == 4) == 1) &&
							((c == 1) + (d == 2) == 1) &&
							((c == 5) + (d == 3) == 1) &&
							((e == 4) + (a == 1) == 1))
							{
							if (a*b*c*d*e == 120)//a,b,c,d,e之间相互不重复
							{
									printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);
								}
							}
						
					}
				}
			}
		}
	}
}
int main()
{
	Fun();
	return 0;
}

④杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

void YangAngle(int arr[][10], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < a; i++)
	{
		for (j = 0; j <= i; j++)
		{
			if (j == 0 || i == j)
			{
				arr[i][j] = 1;
			}
			else
			{
				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
			}
		}
	}
}
void Show(int arr[][10], int a, int b)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < a; i++){
		for (j = 0; j <= i; j++)
		{
			printf("%-4d", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int arr[10][10] = { 0 };
	YangAngle(arr, 10, 10);
	Show(arr, 10, 10);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值