IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言中的操作符 -> 正文阅读

[C++知识库]C语言中的操作符

移位操作符

左移:形式为 <<
右移:形式为 >>

#include<stdio.h>

void main() {
	int a = 3; // 0011 
	int b = a << 1; //0110
	printf("%d" , b);
}

在这里插入图片描述
可以看到左移,是在二进制数的基础上进行的;而结果显示的是十进制,这一点不要忽略;同时,需要明确:

  1. 左移操作符:左边抛弃、右边补0
  2. 首先右移运算分两种:
    2.1.逻辑移位:左边用0填充,右边丢弃
    2.2 算术移位:左边用原该值的符号位填充,右边丢弃

位操作符

位操作符包括:按位与(&),按位或(|),按位异或(^),按位取反(~)
位操作符的对象必须是整型

#include<stdio.h>

void main() {
	int a = 3;		// 0011 
	int b = 5;		// 0101
	int c = a & b;  // 0001
	int d = a | b;  // 0111
	int e = ~d;     // 1000
	int f = a ^ b;  // 0110
	printf("a b按位与 =  %d\n", c);
	printf("a b按位或 =  %d\n", d);
	printf("b按位取反 =  %d\n", e);
	printf("a b按位异或 =  %d\n", f);
}

在这里插入图片描述

这路异或比较容易搞混:其代表相同位0 相异为1

下面引入一个思考 :怎样在不创建临时变量的条件下交换两个数
以一段代码来分析:

#include<stdio.h>

void main() {
	int a = 3;		// 0011 (a) 
	int b = 5;		// 0101 (b)
	printf("a = %d , b = %d \n",a,b);

	int c = a ^ b;  // 0110 (c)
	b = c ^ b;  // 0011 (a)  
	a = c ^ a;  // 0101 (b)
	printf("a = %d , b = %d \n", a, b);
}

在这里插入图片描述

可以看到两个数异或后的结果,再与其中一个数异或,就会得到另一个数,根据这个规律,就可以后期无脑实现交换两个数的操作。
同时,c = a ^ b; c ^ b =a ; 也就是 a ^ b ^ b =a ; 可以 发现一个数和自己异或就等于0;0和任何整数异或都是整数自己;

sizeof和数组

提前还是需要重点强调的是:sizeof(arr)中的arr代表的是数组名,表示整个数组!而传参过去的arr,不是传了整个数组而是传指针,代表数组首元素的地址!

#include <stdio.h>
void test1(int arr[])
{
	printf("%d  ", sizeof(arr));
}
void test2(char ch[])
{
	printf("%d  ", sizeof(ch));
}
int main()
{
	//数组大小为 10个int  但是只初始化了arr[0] = 0;
	int arr[10] = { 0 }; 
	//数组大小为 10个char 但是只初始化了arr[0] = 0;
	char ch[10] = { 0 }; 
	//sizeof(arr) 求的是整个数组容量大小  这是10*4=40 
	//strlen(arr) 求的是数组中字符串的长度 这里是1
	printf("%d  ", sizeof(arr)); 
	//同理 这里是10*1=10							 
	printf("%d  ", sizeof(ch));
	// 这里是传参 ,arr传过去的是首元素地址,是指针 32为系统指针4字节,64位8字节
	// 这里应该是4
	test1(arr); 
	// 同理 这里也是4
	test2(ch); 
	return 0;
}
}

在这里插入图片描述

逗号表达式

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

#include <stdio.h>

int main()
{
	int a = 5;
	int b = 7;
	int c = (a * b, a / b, a - b, a + b);
	printf("C 等于 %d\n",c);
	return 0;
}

在这里插入图片描述
可以看到, “,”表达式只有效最后一个表达式 !

练习题

1. 考察 前置++ 和 后置++

#include<stdio.h>
int main()
{
	int a, b, c;
	a = 5;
	c = ++a; // 前置++ 先a=a+1; 再赋值给c ;此时a=6;c=6
	b = ++c, c++, ++a, a++;//逗号运算符,虽然只看最后一个,但是前面的赋值依然有效
						   //c前置++ 先加后赋值 c=7,c后置++ 反正这里不算赋值且最终也会加 c=8
	                       //a前置++再赋值 a=7, a后置++ 先赋值给b再++  所以 b=7,a=8;
	b += a++ + c;//同理 :a8+c8+b7=b=23 a=9;
	printf("a = %d b = %d c = %d\n:", a, b, c);//所以这里应该 a=9 b=23 c=8
	return 0;
}

结果如下:
在这里插入图片描述
2.写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1

#inlucde<stdio.h>
int fun(int input);
void main() {
	printf("请输入一个数 用来统计其二进制中1的个数\n");
	int input = 0;
	int res = 0;
	scanf_s("%d", &input);
	res = fun(input);
	printf("input的二进制数中 1 的个数位:%d " , res);
	}

int fun(int input) {
		int n = 0;
		for (int i = 0; i < 32;i++) {
		if (((input >> i) & 1)==1) {
			n++;
		}
	}
	return n;
}

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 22:40:09  更:2021-07-30 22:40:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 1:42:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码