C语言第十二课---------操作符的介绍与使用(下)

news2024/9/24 13:22:48

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂
_______________________________________________________

______________________________________________________________________

目录

        条件操作符

        逗号表达式

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

——————————————————————————————————————

插播小知识

1.%u 十进制无符号整数

%d把对应的整数按有符号十进制输出,%u把对应的整数按无符号十进制输出,比如printf("%d,%u\n",-123,-123);,输出则是-123,4294967173——因为-123的补码是11111111111111111111111110000101,在%u控制下把它当正数输出了。

 条件操作符(三目操作符)

exp1 ? exp2 : exp3
exp1为真的话返回exp2,否则返回exp3
#include <stdio.h>
int main()
{
	int a = 10;
	int b = 2;
	int m = 0;
	/*if (a > b)
		m = a;
	else
		m = b;*/
	m = (a > b ? a : b);
	printf("%d", m);
	return 0;
}

逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a = 2 + b, b = a + b);
	printf("%d %d %d", a, b, c);
	return 0;
}

从左到右执行下去,直到最后一个表达式

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

[ ] 下标引用操作符

操作数:一个数组名 + 一个索引值
#include <stdio.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	printf("%d", arr[2]);
	return 0;
}

[]的操作数是arr 和2

( ) 函数调用操作符

#include <stdio.h>
int Add(int a, int b)
{
	return a + b;
}
int main()
{
	int a = 0;
	int b = 2;
	Add(a, b);//()函数调用操作符

	return 0;
}

访问一个结构的成员

. 结构体 . 成员名
-> 结构体指针 -> 成员名
#include <stdio.h>
struct book
{
	char name[20];
	int price;

};
int  main()
{
	struct book b = { "明解C语言", 55 };
	printf("%s\n", b.name);

	struct book* pb = &b;
	printf("%s\n", pb -> name);
	printf("%s\n", (*pb).name);

	return 0;
}

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

隐式类型转换

1.整形提升(运用于小于一个int 大小的数值)

表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为 整型
提升
整型提升的意义 表达式中各种长度可能小于 int 长度的整型值,都必须先转 换为 int unsigned int ,然后才能送入 CPU 去执行运算
如何进行整体提升呢?
整形提升是按照变量的数据类型的符号位来提升的
在int中有signed和unsigend, 所有char也分有符号和无符号,因为C语言没有规定,所以取决于编译器
// 负数的整形提升
char c1 = - 1 ;
变量 c1 的二进制位 ( 补码 ) 中只有 8 个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为 1
提升之后的结果是:
11111111111111111111111111111111
// 正数的整形提升
char c2 = 1 ;
变量 c2 的二进制位 ( 补码 ) 中只有 8 个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为 0
提升之后的结果是:
00000000000000000000000000000001
// 无符号整形提升,高位补 0
注意一下,对char进行提升要先写出8个bit来确定符号位,然后根据符号位进行整体提升,计算机就是这样计算大小小于int的数值
int main()
{
 char a = 0xb6;
 short b = 0xb600;
 int c = 0xb6000000;
 if(a==0xb6)
 printf("a");
 if(b==0xb600)
 printf("b");
 if(c==0xb6000000)
 printf("c");
 return 0;
}
a,b 要进行整形提升 , 但是 c 不需要整形提升
a,b 整形提升之后 , 变成了负数 , 所以表达式 a==0xb6 , b==0xb600 的结果是假 , 但是 c 不发生整形提升 , 则表 达式 c==0xb6000000 的结果是真 .

我们只需要知道小于int大小的数值要整形提升

#include <stdio.h>
int main()
{
	char a = 1;//    00000000000000000000000000000001  补码   ---a存储的只有00000001
	char b = 30;//   00000000000000000000000000011110 补码	----b存储的只有00011110
	char c = a + b;// 参与了运算
					//a整形提升为 00000000000000000000000000000001
					//b整形提升为 00000000000000000000000000011110
					//	结果	  00000000000000000000000000011111
					//00011111  -char c存储的8个bit
					//c整形提升	  00000000000000000000000000011111   --->补码
					//最终原码为  00000000000000000000000000011111 
	printf("%d", c);
	return 0;
}

所以我们可以理解为当字符或者其他小于int长度的,在参与运算或者判断又或者配合某些操作符就会发生整形提升,提升到4个字节,否则原来是多少字节就是多少字节

2.算术转换(用于大小大于或者等于int 大小的数组)

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行

 

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

操作符的属性

复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	//优先级
	b = 9 + 5 * 6;
	//结合性
	b = 6 + 5 + 3;
	return 0;
}

在相邻操作符不一样的时候,先考虑优先级

相邻操作符相同时,考虑结合性

结合性就是计算方向

#include <stdio.h>
int main()
{
 int i = 1;
 int ret = (++i) + (++i) + (++i);
 printf("%d\n", ret);
 printf("%d\n", i);
 return 0;
}

这个代码在不同编译器结果不一样,所以这个代码的写法不行,我们可以看看vs编译器是怎样运行的,我们看看反汇编

mov :是把后面的值存放到前面去, 把1存放到dword ptr[i]

add:增加

eax、ecx、都是寄存器

总结 :我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题 的。

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

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

相关文章

第一章操作系统概述

0.定义 操作系统(Operating System&#xff0c;OS)是指控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。 操作系统是系统资源的管理者向上层提供方…

C语言:通讯录(文件操作+动态内存管理) 简易版

目录 前言 一&#xff0c;通讯录菜单 二&#xff0c;通讯录菜单主函数 1.使用枚举&#xff1a; 2.主函数&#xff1a; 三&#xff0c;通讯录功能实现 1.创建通讯录 2.初始化通讯录 3&#xff0c;添加联系人 4&#xff0c;删除联系人 5&#xff0c;搜索联系人 6&…

SpringBoot面试题及答案整理

1、什么是 Spring Boot&#xff1f; 多年来&#xff0c;随着新功能的增加&#xff0c;spring 变得越来越复杂。访问spring官网页面&#xff0c;我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目&#xff0c;我们必须添…

【MTI 6.S081 Lab】Page tables

【MTI 6.S081 Lab】Page tables Speed up system calls (easy)实验任务Hints哪些其它的系统调用能通过这个共享页面变得更快&#xff0c;请解释。解决方案分配和释放页面初始化结构 实验心得 Print a page table (easy)实验任务Hints根据图3-4从文本中解释vmprint的输出。第0页…

机器学习:自动编码器Auto-encoder

Self-supervised Learning Framework 不用标注数据就能学习的任务&#xff0c;比如Bert之类的。但最早的方法是Auto-encoder。 Outline Auto-encoder encoder输出的向量&#xff0c;被decoder还原的图片&#xff0c;让输出的图片与输入的图片越接近越好。 将原始的高维向量变…

红黑树解密:为什么根节点必须是黑色,两个红色节点不能挨着?

红黑树解密&#xff1a;为什么根节点必须是黑色&#xff0c;两个红色节点不能挨着&#xff1f; 博主简介一、引言1.1、红黑树是什么及其特点1.2、根节点为黑色和红色节点不连续的性质介绍 二、为何根节点必须是黑色&#xff1f;三、为何两个红色节点不能挨着&#xff1f;总结 博…

PCB绘制时踩的坑 - SOT-223封装

SOT-223封装并不是同一的&#xff0c;细分的话可以分为两种常用的封装。尤其是tab脚的属性很容易搞错。如果你想着用tab脚连接有属性的铺铜&#xff0c;来提高散热效率&#xff0c;那么你一定要注意你购买的器件tab脚的属性。 第一种如下图&#xff0c;第1脚为GND&#xff0c;第…

Packet Tracer - 备份配置文件

Packet Tracer - 备份配置文件 目标 第 1 部分&#xff1a;与 TFTP 服务器建立连接 第 2 部分&#xff1a;从 TFTP 服务器传输配置 第 3 部分&#xff1a;将配置和 IOS 备份到 TFTP 服务器上 拓扑图 背景/场景 本练习旨在展示如何从备份恢复配置&#xff0c;然后执行新的…

Stephen Wolfram:神经网络

Neural Nets 神经网络 OK, so how do our typical models for tasks like image recognition actually work? The most popular—and successful—current approach uses neural nets. Invented—in a form remarkably close to their use today—in the 1940s, neural nets …

如何查找网页的cookie【以两步路平台】

登录/注册账号【重要】 进入开发人员工具 刷新页面&#xff0c;发现“全部”对应的列表发生改变 找到列表首页的文本后缀.htm的信息&#xff0c;点开后查找网站的Cookie。 注意&#xff1a;Cookie必须在登陆后的才有效&#xff0c;并且每次爬取都需要重新查找更新Cookie&…

六、初始化和清理(1)

本章概要 利用构造器保证初始化方法重载 区分重载方法重载与基本类型返回值的重载无参构造器 this 关键字在构造器中调用构造器static 的含义 利用构造器保证初始化 "不安全"的编程是造成编程代价昂贵的罪魁祸首之一。有两个安全性问题&#xff1a;初始化和清理。…

redis和数据库双写不一致一般如何解决-面试

先介绍一下常规的几种做法 1、先删缓存&#xff0c;在改数据库 2、先改数据库&#xff0c;在删缓存 3、先改数据库&#xff0c;在改缓存 4、延迟双删&#xff08;先删缓存&#xff0c;再改数据库&#xff0c;延迟几百毫秒&#xff0c;再删缓存&#xff09;&#xff0c;此方…

通过gre隧道建立私有专用网络

Internet 配置 vlan 128 vlan 202 router1&#xff1a; router2&#xff1a; router1 ping router 2

一起学SF框架系列5.11-spring-beans-数据校验validation

在日常的项目开发中&#xff0c;应用在执行业务逻辑之前&#xff0c;为了防止非法参数对业务造成的影响&#xff0c;必须通过校验保证传入数据是合法正确的&#xff0c;但很多时候同样的校验出现了多次&#xff0c;在不同的层&#xff0c;不同的方法上&#xff0c;导致代码冗余…

map求和accumulate、参数互换

运行代码&#xff1a; //map求和accumulate、参数互换 #include"std_lib_facilities.h"istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss;if(is>>ii)mm[ss] ii;return is; }t…

VSCode中python代码输出中文乱码解决

前言 最近在vs code里面执行python脚本时&#xff0c;只有打印中文&#xff0c;就会乱码。 内容 先检查右下角编码集设置是否正确 检查右下角编码集设置是否正确 &#xff1a; 如果不是utf-8点击修改。 如果还是不行&#xff0c;就进行下面的操作 修改用户设置 路径&a…

【算法基础:动态规划】5.1 背包问题

文章目录 01背包例题&#xff1a;2. 01背包问题 完全背包例题&#xff1a;3. 完全背包问题 多重背包例题&#xff1a;4. 多重背包问题 I例题&#xff1a;5. 多重背包问题 II&#xff08;数据范围较大&#xff1a;二进制优化&#xff09; 分组背包例题&#xff1a;9. 分组背包问…

2023/7/29总结

项目&#xff1a; 这几天主要实现了评论的功能点: 还是有点小bug&#xff0c;还在更改中…… 修改个人中心的界面 接下来是把收藏完善&#xff0c;因为收藏需要用户自己创建一个新的收藏夹

iOS开发-转场动画切换界面(类似系统动画)

iOS开发-转场动画切换界面&#xff08;类似系统动画&#xff09; 在开发中&#xff0c;无论我们使用 push 还是 present 推出新的 viewcontroller 时&#xff0c;系统为了提高用户体验都会为我们默认加上一些过渡动画。但是开发中需要自定义过度动画效果。这里就需要用到了转场…

二十五章:用于弱监督语义分割的激活调节和重新校准方案

0.摘要 图像级弱监督语义分割&#xff08;WSSS&#xff09;是一项基础而具有挑战性的计算机视觉任务&#xff0c;有助于场景理解和自动驾驶。大多数现有方法利用基于分类的类激活图&#xff08;CAMs&#xff09;作为初始伪标签&#xff0c;但这些方法往往关注区分性的图像区域&…