操作符 | 入门

本文详细介绍了C语言中的各种操作符,包括算术、移位、逻辑、复合赋值等,并通过实例展示了它们的用法和效果。重点讨论了位操作符如按位与、按位或、按位异或以及左移、右移操作,并分析了它们在二进制运算中的作用。此外,还探讨了类型转换和条件操作符在编程中的应用。
摘要由CSDN通过智能技术生成
#define _CRT_SECURE_NO_WARNINGS 1
 操作符详解
#include<stdio.h>
int main()
{
	int a = 5 / 2;// 商2余1
	double b = 5 / 2.0; // 整数除法是不会得到小数的
	// % 取模必须都是整数
	printf("%d\n", a);
	printf("%lf\n", b);
	system("pause");
	return 0;
}

 移位操作符
int main()
{
	int a = 16;
	// >> -- 右移操作符
	// 移动的是二进制位
	int b = a >> 1;
	printf("%d\n", b);
	system("pause");
	return 0;
}

 右移是算术逻辑
 即右边丢弃,左边保留符号位

int main()
{
	int a = -1;
	// 整数的二进制表示有: 原码、反码、补码
	// 存储到内存的都是补码
	// 10000000000000000000000000000001 - 原码
	// 11111111111111111111111111111110 - 反码
	// 11111111111111111111111111111111 - 补码
	int b = a >> 1;
	printf("%d\n", b);
	system("pause");
	return 0;
}


  左移操作符
  左边丢弃、 右边补0

int main()
{
	int a = 5;
	// << -- 左移操作符
	// 移动的是二进制位
	int b = a << 1;
	printf("%d\n", b);
	system("pause");
	return 0;
}


  逻辑操作符
 & 按位与
 | 按位或
 ^ 按位异或


int main()
{
	int a = 3;
	int b = 5;
	//int b = -1; c=3 说明数据存储是以补码 / 正数原码与补码一致
	int c = a&b;
	int d = a|b;
	int e = a^b;
	printf("%d\n %d\n %d\n", c,d,e);
	system("pause");
	return 0;
}

 不能创建临时变量

int main()
{
	int a = 3;
	int b = 5;
	
	// 加减法 - 结果太大可能会溢出

	//a = a + b;
	//b = a - b;
	//a = a - b;

	// 异或办法  - a^a=0 a^0=a a^b=b^a
	a = a^b;
	b = a^b;
	a = a^b;

	return 0;
}

int main()
{
	int num = 0;
	int count = 0;
	scanf("%d", &num);
	// 32bit
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (1 == ((num >> i) & 1))
			count++;
	}
	// 统计num的补码中有几个1
	//while (num) // 当num=-1时无法计算
	//{
	//	if (num % 2 == 1)
	//		count++;
	//	num = num / 2;
	//}
	printf("%d\n", count);
	system("pause");
	return 0;
}

 复合赋值符
 a += 2    ----  a=a+2;  
 a+b --- + "双目操作符"


 !a --- 真变成假  假变成真

int main()
{
	//int a = 10;
	//int* p = &a;// 取地址操作符
	//*p = 20;// 解引用操作符|简介访问操作符   20 - a
	//if (!a)
	//{
	//	printf("hhee");
	//}

	int a = 10;
	char c = 'c';
	char* p = &c;
	int arr[10] = { 0 };
	//sizeof 计算变量所占内存空间的大小,单位是字节
	printf("%d\n", sizeof(a));//4
	printf("%d\n", sizeof(c));//1 | 计算c里面的内容
	printf("%d\n", sizeof(p));//4 char地址
	printf("%d\n", sizeof(arr));//40  10个int
		system("pause");
		return 0;
}

int main()
{
	short s = 0;  // short 短整型 , 2个字节
	int a = 10;
	printf("%d\n", sizeof(s=a+5));  //2
	printf("%d\n", s); // 0
	return 0;
}


int main()
{
	//int a = 0;
	//00000000000000000000000000000000
	//~a
	//11111111111111111111111111111111 - 补码
	//11111111111111111111111111111110 - 反码
	//10000000000000000000000000000001 - 原码
	//printf("%d\n", ~a);
	int a = 11;
	a=a | (1 << 2);
	printf("%d\n", a);
	a = a&(~(1 << 2));

	//00000000000000000000000000001011
	//00000000000000000000000000000100
	printf("%d\n", a);  //~按位取反 // 二进制位 |-1
	return 0;
}

int main()
{
	int a = 10;
	//printf("%d\n", ++a);// 前置++,先++ 后使用
	printf("%d\n", a++); // 后置++,先使用,后++
	return 0;
}

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

void test2(char arr2[])
{
	printf("%d\n", sizeof(arr2));//4 |因为是指针、指针存储以四个字节存储
}

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


int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	//i = a++&&++b&&d++;// a++ 先使用后++ / 左边只要有0,&&后边就不执行了
	// 执行&&后 a=a+1 | 然后后边++b就不计算了,因为判断为假
	i = a++ || ++b || d++;
	printf("%d %d %d %d", a, b, c, d);//a=0 //  1 2 3 4
	//若a=5 // 2 3 3 5
	return 0;
}


 条件操作符
  三步操作符
int main()
{
	int a = 10;
	int b = 20;
	//if (a > 5)
	//	b = 3;
	//else
	//	b = -3;

	b = (a > 5? 3: -3);
	printf("%d\n", b);

	return 0;
}


 学生
struct Stu
{
	char name[20];
	int age;
	char id[20];
};

int main()
{
	int a = 10;
	// 使用struct Stu这个类型创建了一个学生对象s1,并初始化
	struct Stu s1 = {"张三",20,"2019099809"};
	struct Stu* ps = &s1;
	printf("%s\n", ps->name);
	//  结构体指针-> 成员们
	printf("%s\n", (*ps).name);
	printf("%s\n", s1.name);
	printf("%d\n", s1.age);
	printf("%s\n", s1.id);
	// 结构体变量.成员名
	return 0;
}


 隐式转换类型

int main()
{
	char a = 3;
	//00000000000000000000000000000011
	//00000011 - a
	char b = 127;
	//00000000000000000000000001111111
	//01111111 - b

	// a和b如何相加
	// 00000000000000000000000000000011
	// 00000000000000000000000001111111
	//=00000000000000000000000010000010
	char c = a + b;
	// 10000010 - c // 按高位补充
	// %d 整型
	// 11111111111111111111111110000010 - 补码
	// 11111111111111111111111110000001 - 反码
	// 10000000000000000000000001111110 - 原码
	printf("%d\n", a);// a 和b 就是原码
	printf("%d\n", b);
	printf("%d\n", c);

	return 0;
}

 实例
int main()
{
	char a = 0xb6;// 10110110 - 一个字节
	short  b = 0xb600;// 两个字节
	int c = 0xb6000000;
	if (a == 0xb6)// 比较也是运算符, a相当于FFFFFFb6
		printf("a");
	if (b == 0xb600)
		printf("b");
	if (c == 0xb6000000)
		printf("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));//1 !假 | !不是运算符, 用于字符,有字符变成空字符
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值