C语言奇奇怪怪表达式‘abcd‘,及操作符详解

news2025/1/12 5:55:05

前言

回顾操作符和一些表达式方面的知识。

表达式及操作符

  • 前言
  • 算术操作符 : + - * /
  • 位操作符
    • >>、<<
      • >>
        • 算数右移
        • 逻辑右移
      • <<
    • 小结
    • &、|、~
      • &:有0则为0,两个1才为1
      • |: 有1则为1,两个0才为0
    • ~(按位取反)
      • 符号位要参与吗? 要参与。
    • ^ (按位异或)(一个很强的操作符)
      • 规律
      • 单身狗问题
      • LeetCode
  • 单目操作符
    • &、|
    • sizeof(也可分为关键字)
    • (强制类型转换)
    • +(正号)、-(负号)
    • ++,--
      • 深入了解后置++
  • 逻辑运算符
    • &&
      • &&短路问题
    • ||
      • || 短路问题
  • 三目操作符
    • ?: (利用好了很省事)
      • 以归并排序中的Merge过程为例
  • 逗号表达式
  • 下标引用、函数调用、结构体引用
    • []、()、->
  • \
    • 1.续行
    • 2.转义字符
  • 奇奇怪怪表达式
    • 你了解'abcd'吗?
    • ++i + ++i + ++i = ?
  • 隐式转换,以及算数转换
    • 隐式转换--整型提升
    • 算术转换

算术操作符 : + - * /

整除除以整除得到的是整数,如果其中有浮点数那么结果是浮点数。

位操作符

位操作符都是作用在二进制上的。

>>、<<

>>

>>:右移操作符,又分为逻辑右移和算数右移。
当变量是有符号的,执行>>是算数右移动。
当变量是无符号的,执行>>是逻辑右移。

算数右移

最高位补符号位,右边丢弃

逻辑右移

最高位补0,右边丢弃

在这里插入图片描述

在这里插入图片描述

<<

<<:左移操作符。左边丢弃,右边补0

在这里插入图片描述

在这里插入图片描述

小结

1.右移:相当于除以2,左移:相当于乘以2。
左移和右移改变的是二进制位,每个二进制对应的权值是不同的。

在这里插入图片描述

2.左移右移之后,原来的变量是没有改变的。
为什么原来的变量值没有改变?计算都是在CPU内进行的,位运算也不例外。数据是存在内存中的。当在CPU内进行计算的时候,这个结果并没有写回内存,因此原来的变量的值是不会改变的。

在这里插入图片描述

3.左移、右移不要移动负数位,因为在c语言标准中并没有规定。例如i>>-1 ; i<<-1

&、|、~

&:有0则为0,两个1才为1

在这里插入图片描述

&1:检测比特位是否为1

|: 有1则为1,两个0才为0

在这里插入图片描述

| 1:将比特位置为1

~(按位取反)

符号位要参与吗? 要参与。

~:按位取反,顾名思义。1–>0,0–>1。符号位是要参与运算的

在这里插入图片描述

^ (按位异或)(一个很强的操作符)

^:同为0,异为1

在这里插入图片描述

规律

1.满足交换律和结合律
2.a^a = 0
3.a^0 = a

在这里插入图片描述

单身狗问题

先拿单身狗练练手在做leetCode
题目:
一个数组中只有一个数字单独出现了一次,其它重复出现,请找出这个数。
利用^的规律很容易得到结果。将所有的数异或就能找到了

int main()
{
	int arr[] = { 1,2,3,4,1,2,3 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = 0;
	for (int i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	printf("%d", ret);
	return 0;
}

在这里插入图片描述

LeetCode

消失的数
在这里插入图片描述

同样也是异或怎么做呢?第一次遍历一遍数组并且异或一次,因为这个是连续的,只要把个数加1,在异或一遍就能找到这个缺失数了。
例如: 3 0 1,第一次先异或了。
第二次 0 1 2 3 异或,那很容易找到2了。

int missingNumber(int* nums, int numsSize){
    int i = 0;
    int ret = 0;
    for(i = 0;i<numsSize;i++)
    {
        ret ^=nums[i];
    }
    for(i=0;i<numsSize+1;i++)
    {
        ret ^=i;
    }
    return ret;

}

单目操作符

逻辑取反
!true == false
!false == true

&、|

sizeof(也可分为关键字)

求元素类型的大小。
要与strlen区分, sizeof会把'\0'也会计算在内,strlen不会。

在这里插入图片描述

另一个要注意的是strlen括号内的表达式是不会计算的。在程序的链接过程前,编译器就可以将类型大小计算出来并且替换。

在这里插入图片描述

返回值是无符号整形

(强制类型转换)

什么时候会使用?类型不匹配的时候就需要使用强转。

+(正号)、-(负号)

++,–

前置:先自增后使用
后置:先使用后自增

深入了解后置++

int a = 1;
int b = a++;

先使用b = a ;,再a = a + 1;
那么问题来了如果只有a++;,怎么去理解先使用呢?
“怎么使用”:存入寄存器中。
在这里插入图片描述

逻辑运算符

&&

&&:逻辑与。 并且的意思

&&短路问题

多个条件逻辑与的时候,如果有一个条件为假整个结果都为假了,后面的条件是不会执行的。
小明爸爸说,小明你只要语文数学都考了95+,就可以奖励你100元。
当小明知道语文考了90分,他还需要知道数学的成绩吗?不需要了,已经不可能了。

在这里插入图片描述

||

||:逻辑或。或者的意思

|| 短路问题

多个条件逻辑或的时候,如果有一个条件为真整个结果都为真了,后面的条件是不会执行的。
小明爸爸说,小明你只要语文或者数学考了95+,就可以奖励你100元。
当小明知道语文考了96分,他还需要知道数学的成绩吗?不需要了,奖励已经可以到手了。
在这里插入图片描述

三目操作符

?: (利用好了很省事)

以归并排序中的Merge过程为例

void Merge(int* arr, int left,int mid, int right)
{
	int i = left;
	int j = mid + 1;
	int* help = (int*)malloc(sizeof(int) * (right - left + 1));
	int k = 0;
	while (i <= mid && j <= right)
	{
		help[k++] = arr[i] > arr[j] ? arr[j++] : arr[i++];
	}
	while (i <= mid)
		help[k++] = arr[i++];
	while (j <= right)
		help[k++] = arr[j++];
	for (i = 0; i < k; i++)
	{
		arr[i+left] = help[i];
	}
	free(help);
}
void MergeSort(int* arr, int left, int right)
{
	if (left >= right)
		return;
	int mid = (left + right) / 2;
	MergeSort(arr, left, mid);
	MergeSort(arr, mid + 1, right);
	Merge(arr, left, mid ,right);
}

下面一段代码的三目很精髓。如果arr[i] 大于 arr[j],就把arr[j]的值赋值给help[k],再进行,j、k的自增,否则就把arr[i]的值赋值给help[k],再i,k的自增

	while (i <= mid && j <= right)
	{
		help[k++] = arr[i] > arr[j] ? arr[j++] : arr[i++];
	}

逗号表达式

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

在这里插入图片描述

为什么要带()呢? =的优先级是大于,的,不加(),会把 f = b + a当成一个表达式。

在这里插入图片描述

每个表达式都会计算出结果的
在这里插入图片描述

下标引用、函数调用、结构体引用

[]、()、->

\

有两个作用

1.续行

当续行来用时,后面是不能加空格的。

在这里插入图片描述
在这里插入图片描述

2.转义字符

在这里插入图片描述

奇奇怪怪表达式

你了解’abcd’吗?

看到'a'你肯定会想到字符,然后会想到char,认为'a'是一个字节大小的。可真是这样吗?当然不是。

在这里插入图片描述

char类型才是1个字节大小。 char a = 'ab';这个过程发生了截断。

在这里插入图片描述
在这里插入图片描述

''中最多放4个字符。

在这里插入图片描述

++i + ++i + ++i = ?

在这里插入图片描述
在这里插入图片描述

在不同编译器下同一个复杂表达式,所算出的结果是不同这是为什么?和编译器的处理机制有关。写回的时机不同。
VS:先进行自增3次,并写回内存这个时候 i = 3; 相加结果就为12。

在这里插入图片描述

Linux:前两个i自增并且写回内存,这时i = 3, 3 + 3 = 6,在执行自增i = 4,最后6 + 4 = 10

隐式转换,以及算数转换

隐式转换–整型提升

类型大小小于4字节的都会发生整形提升char,short
整形提升是按照变量类型的符号为提升的。
char a = -1;
提升前11111111
提升后11111111 11111111 11111111 11111111
char a = 1;
提升前00000001
提升后00000000 00000000 00000000 00000001

在计算时发生整形提升。

在这里插入图片描述

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。
如果某个操作数的类型在下面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算
如果将一个高级的类型赋值给低级的类型,会有精度的丢失。
比如:int a = 5.13;实际上 a == 5;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

透彻感知 数字孪生智慧隧道Web3D可视化监控系统

今天为大家分享一个采用 数维图 的 Sovit3D 构建轻量化 3D 可视化场景的案例——智慧隧道三维可视化系统。多维度呈现隧道内外场景&#xff0c;实现隧道内态势的实时监测&#xff0c;运维设备、控制系统和信息系统的互联互通。加强隧道内设备的全状态感知力与控制力&#xff0c…

AI技术赋能数智化转型,激发企业变革创新

人工智能的概念第一次被提出&#xff0c;是在20世纪50年代&#xff0c;距今已七十余年的时间。随着深度神经网络技术的逐渐成熟和计算能力的大幅提升&#xff0c;AI技术实现了飞跃式地发展&#xff0c;已经在工业、制造、能源、金融等各行各业得到了广泛有效地应用实践&#xf…

2022全年度饮料十大热门品牌销量榜单

随着国民经济的发展及居民收入水平不断提升&#xff0c;我国饮料行业规模处于不断增长的状态&#xff0c;饮料种类也日益繁多。同时&#xff0c;瓶装水、碳酸饮料、果汁饮料、茶饮料、功能饮料、含乳饮料等品类竞争激烈。但未来&#xff0c;我国饮料市场还有很大发展空间。 根据…

VS code配置C语言环境

下载编译器MinGW并解压&#xff08;任意路径&#xff09; 官网页面&#xff1a;MinGW-w64 下载页面&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net MinGW添加至环境变量 D:\VS code\mingw64\bin 注&#xff1a;不能有中文&#xff1b…

SpringBoot整合Swagger3.0

目录 第一步&#xff1a;引入依赖 第二步&#xff1a;yml配置文件添加一下内容 第三步&#xff1a;添加SwaggerConfig配置类 第四步&#xff1a;启动类添加注解 第五步&#xff1a;Controller层类添加注解 第六步&#xff1a;实体类添加注解 第七步&#xff1a;启动项目访…

一篇文章教你如何用界面组件DevExpress WPF为应用配置文件选择!

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

【K3s】第8篇 详解 Kubernetes 组件

目录 1、Kubernetes 组件 2、控制平面组件&#xff08;Control Plane Components&#xff09; kube-apiserver etcd kube-scheduler kube-controller-manager cloud-controller-manager 3、Node 组件 kubelet kube-proxy 1、Kubernetes 组件 当你部署完 Kubernetes&am…

五、Java 12 新特性概述

五、Java 12 新特性概述 JDK12 在 2019 年 3 月 19 号正式发布&#xff0c;不同于JDK11&#xff0c;JDK12并不是一个LTS版本。作为一个中间版本&#xff0c;JDK12版本特性增加较少。 2017年宣布的加速发布节奏要求每六个月发布一次功能&#xff0c;每季度更新一次&#xff0c;每…

北鲲教程|基于 ABAQUS 的 CFRP 加固钢筋混凝土柱承载能力分析

随着我国经济实力快速发展与国家竞争力迅速提高&#xff0c;尤其是“一带一路”倡议与“海洋开发战略”实施&#xff0c;我国基础设施建设正逐步冲破东部地区的狭长地带&#xff0c;不断扩展至更加广阔的海洋与西部地区。混凝土结构作为土木工程中最常用的结构形式&#xff0c;…

女生戴蓝牙耳机什么颜色好看?适合女生的高颜值蓝牙耳机

蓝牙耳机作为当前畅销的数码单品&#xff0c;越来越多的品牌商推出新的蓝牙耳机&#xff0c;导致选购的时候不知道从何下手&#xff0c;蓝牙耳机最主要的是清晰音效&#xff0c;其次就是佩戴舒适度&#xff0c;但是近年来不少的人在外观上做出很大的改变&#xff0c;吸引人们的…

测试执行中工作效率相关指标

→ 执行效率&#xff1a;利用测试用例文档页数除于此次系统测试执行的时间总和(不包含用例文档编写时间)。补充指标方法是用例的个数除于此次系统测试的时间总和。用于获得工作中测试人员每小时执行测试的速度。 公式&#xff1a;∑测试用例文档页数(页) / ∑执行系统测试的有效…

Java多线程创建及典型实例(多线程买票)

Java多线程创建及典型实例&#xff08;多线程买票&#xff09;多线程1. Thread2. Runnable3. 线程通信4. Callable5. 线程池多线程卖票实例1. 继承Thread类&#xff08;存在线程安全问题&#xff09;2. 实现Runnable接口&#xff08;存在线程安全问题&#xff09;3. 对线程安全…

Mybatis源码(三)如何操作数据库

前言 接着environmentElement获取数据源信息后&#xff0c;同级执行代码的mappersElement。里面参杂了mybatis缓存。 Mybatis源码&#xff08;三&#xff09;如何操作数据库 MyBatis源码&#xff08;二&#xff09;如何执行sql Mybatis源码&#xff08;一&#xff09;获取数…

从咖啡馆到世界,共赴下一个十年 |写在 EMQX 开源十周年

十年前,在 2012 年 12 月 17 日,源于个人对 Erlang、MQTT 和开源的热爱,EMQX 诞生于一家咖啡馆并作为开源项目在 GitHub 上发布了初次提交。十年后的今天,EMQX 已成长为 Erlang 生态中最具影响力的物联网开源基础软件项目,作为全球最具扩展性的 MQTT 消息服务器在物联网、工业互…

【Java开发】Spring Cloud 02 :微服务项目介绍及开发环境

了解完 Spring Cloud 的发展背景以及各个组件库后&#xff0c;在敲代码前&#xff0c;本章节会聊一聊优惠券平台项目的整体功能和模块&#xff0c;以及每个功能点的技术选型和背后的依据&#xff0c;最后讲解下搭建项目所需的开发环境~ 目录 1 优惠券平台项目 1.1 项目介绍 …

[Linux安装软件详解系列]05 安装ElasticSearch和IK分词器

目录1、安装ElasticSearch2、安装IK分词器操作系统&#xff1a;Anolis OS 8.6 RHCK 64位、jdk1.8。ElasticSearch&#xff1a;v6.8.6下载文件&#xff1a; ElasticSearch v6.8.6&#xff1a; https://elastic.co/downloads/elasticsearch IK分词器 v6.8.6&#xff1a;https://g…

脚本-简单脚本

脚本执行顺序 默认脚本是无序执行&#xff0c;也就是哪个脚本先执行&#xff0c;哪个脚本后执行是未知的。 也可以手动指定执行顺序&#xff0c; 在如上图所示中&#xff0c;可以点击 加号 按钮&#xff0c;然后添加脚本的顺序&#xff0c;数值越大&#xff0c;执行顺序越靠后…

为什么团队执行力差,管理者应该如何解决?

没有执行力&#xff0c;一切都是空谈。团队执行力差可能是这些原因&#xff1a; 1、目标不明确&#xff0c;项目方向不清晰。 2、责任不清&#xff0c;不知道干啥&#xff0c;也不知道为什么而干。 3、技能不熟练&#xff0c;没有明确的完成标准。 4、分配任务&#xff0c;…

【JavaScript】飞机大战

文章目录一、效果演示设计思路二、鼠标版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码js.js文件plane.js文件三、键盘版飞机大战代码展示1.HTML结构代码2.CSS样式代码3.JavaScript代码四、代码资源分享一、效果演示 利用html&#xff0c;css&#xff0c;js制…

华为云服务器上部署war包(虚拟机也同样适用)

目录linux部署war包安装jdk关闭防火墙简单粗暴&#xff08;推荐虚拟机使用&#xff09;复杂但安全&#xff08;推荐服务器使用&#xff09;安装tomcat部署war包linux部署war包 安装jdk 执行命令查看可安装java版本 yum -y list java*执行命令安装jdk8 yum install -y java-…