C语言操作符详解(下)
提示:本篇内容是C语言操作符详解下篇
文章目录
- 前言
- 八、条件表达式
- 九、逗号表达式
- 十、 下标引用、函数调用和结构成员
- 1. [ ] 下标引用操作符
- 2. ( ) 函数调用操作符
- 3.结构成员访问操作符
- 十一、表达式求值
- 1. 隐式类型转换
- 举例说明1
- 举例说明2
- 举例说明3
- 2.算数转换
- 3.操作符的属性
前言
八、条件表达式
表达式1为真,执行表达式2,否则执行表达式3
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {int a = 0;int b = 0;scanf("%d", &a);a > 5 ? (b = 3) : (b = -3);printf("%d\n", b);}
int main() {int a = 0;int b = 0;scanf("%d %d", &a, &b);int m = (a > b ? a : b);printf("%d\n", m);
}
九、逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
int main() {int a = 1;int b = 2;int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式printf("%d\n", c);
}
十、 下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
2. ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
#include<string.h>
int Add(int x, int y) {return x + y;
}
int main() {int len = strlen("abc");//()函数调用操作符printf("%d\n", len);int c = Add(3, 5);//Add,3,5都是()操作数//test();//调用函数时()的操作数只有一个,是函数名return 0;
}
3.结构成员访问操作符
struct S {int num;char c;
};
void test(struct S* ps) {printf("%d\n", (*ps).num);printf("%d\n", (*ps).c);//-> 结构成员访问操作符//结构体指针->结构体成员printf("%d\n", ps->num);printf("%c\n", ps->c);
}
int main() {struct S s = { 100,'b' };//结构体初始化成员使用{}//打印结构体中的成员数值printf("%d\n", s.num);printf("%c\n", s.c);//操作符 结构体变变量.结构体成员名test(&s);
}
十一、表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
1. 隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。(缺省整型就是默认整型int)
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
b和c的值被提升为普通整型,然后再执行加法运算
加法运算完成之后,计算之后的结果也是整型,但是a是char类型, 结果将被截断,然后再存储于a中
整型提升的意义:(整形提升只针对char和short)
适用CPU的通用寄存器的长度
举例说明1
int main() {char a = 3;//00000000 00000000 00000000 00000011 int 类型的3的补码//char类型只有存储1个字节(8个bit位)的数据 00000011---截断char b = 127;//00000000 00000000 00000000 01111111 127的补码//01111111----截断char c = a + b;//00000011//01111111//整形提升//整形提升是按照变量的数据类型的符号位来提升的//提升之后://00000000 00000000 00000000 00000011//00000000 00000000 00000000 01111111//相加后的结果://00000000 00000000 00000000 10000010//c的类型是char,结果截断之后为:10000010//提升之后的补码:11111111 11111111 11111111 10000010//反码:11111111 11111111 11111111 10000001//原码:10000000 00000000 00000000 01111110//-126printf("%d\n", c);return 0;}
解释:
1.计算的时候用补码来计算
2.short类型和char类型的两个数相加时要进行整形提升
3.整形提升是按照变量的数据类型的符号位来提升的
4.计算之后得到整形提升之后的补码,但是由于接收结果的类型是char类型,只能存储一个字节的数据(8个比特位),所以要截断,截断之后的8个比特位就是接收结果的变量的值
但是打印结果c的时候,char类型的数据要以%d的形式打印出来,这时候还要进行整形提升,提升之后的是它的补码,%d打印出来结果的值是原码
举例说明2
int main()
{//char类型的取值范围是:-128到127char a = 0xb6;//b6: 1011 0110short b = 0xb600;int c = 0xb6000000;if (a == 0xb6)printf("a");if (b == 0xb600)printf("b");if (c == 0xb6000000)printf("c");return 0;
}
解释:
1.0x开头的是16进制的数字.
2.不打印a,b的解说一:
a在执行==时,b6整形提升的时候最高位是1,前面都补1,结果一定不等于0xb6,所以不会打印a;同理变量b最高位是1,整形提升的时候最高位是1,前面都补1,结果一定不等于0xb600,所以不会打印b
不打印a,b的解说二:
16进制0xb6的数值是182,但是char类型的取值范围是-128到127,放不了182,所以a肯定不会和0xb6相等.b同理
3.但是对于c来说是int类型的数据,不需要整形提升,所以c可以打印出来
a,b要进行整形提升,但是c不需要整形提升
a,b整形提升之后,变成了负数,所以表达式
a== 0xb6 , b== 0xb600 的结果是假,但是c不发生整形提升,则表
达式 c==0xb6000000 的结果是真.
举例说明3
int main()
{char c = 1;char d=2;printf("%u\n", sizeof(c));printf("%u\n", sizeof(+c));printf("%u\n", sizeof(-c));printf("%u\n",sizeof(c+d));return 0;
}
解释:
1.sizeof©算的是char类型变量的大小,结果为1
2.+c,-c也是表达式,计算的时候也要进行整形提升,结果算的是int类型变量的大小,结果为4
3.char类型和char类型相加的时候都要进行整形提升,提升之后的结果还是整形,sizeof(c+d)结果是4
4.c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.
表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节
5.%u打印输出无符号数
2.算数转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
下面没有讨论char和short,因为char和short类型的数据在计算的时候要整形提升.
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
3.操作符的属性
复杂表达式的求值有三个影响的因素:
(1)操作符的优先级
(2)操作符的结合性
(3)是否控制求值顺序
两个相邻的操作符先执行哪个?
取决于他们的优先级,如果两个的优先级相同,取决于他们的结合性.
通过上表发现:
控制执行顺序的有四个:
&& || ? : ,
所以上式有两个计算顺序:
注意:同上,操作符的优先级只能决定自减–的运算在+的运算的前面,但是我们并没有办法得知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义的。
//代码3-非法表达式
int main()
{int i = 10;i = i-- - --i * ( i = -3 ) * i++ + ++i;printf("i = %d\n", i);return 0;
}
代码3在不同编译器中测试结果:非法表达式程序的结果
//代码4
int fun()
{static int count = 1;return ++count;
}
int main()
{int answer;answer = fun() - fun() * fun();printf( "%d\n", answer);//输出多少?return 0;
}
这个代码有没有实际的问题?
有问题!
虽然在大多数的编译器上求得结果都是相同的。但是上述代码 answer = fun() - fun() * fun(); 中我们只能通过操作符的优先级得知:先算乘法,再算减法。
函数的调用先后顺序无法通过操作符的优先级确定
尝试在linux 环境gcc编译器,VS2013环境下都执行,看结果
//代码5
#include <stdio.h>
int main()
{int i = 1;int ret = (++i) + (++i) + (++i);printf("%d\n", ret);printf("%d\n", i);return 0;
}
VS2013环境的结果:
寄存器:(计算机里面的存储器)
ebp,esp 一般用来存放地址
eax
ebx
ecx
edx
看看同样的代码产生了不同的结果,这是为什么?
简单看一下汇编代码.就可以分析清楚.
这段代码中的第一个 + 在执行的时候,第三个++是否执行,这个是不确定的,因为依靠操作符的优先级和结合性是无法决定第一个 + 和第
三个前置 ++ 的先后顺序。
总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。
结语:C语言操作符的讲解已全部结束.你是否有所收获呢小伙伴们?记得点赞收藏博客关注后续的C语言内容哦~🥰💕
相关文章:
C语言操作符详解(下)
提示:本篇内容是C语言操作符详解下篇 文章目录前言八、条件表达式九、逗号表达式十、 下标引用、函数调用和结构成员1. [ ] 下标引用操作符2. ( ) 函数调用操作符3.结构成员访问操作符十一、表达式求值1. 隐式类型转换举例说明1举例说明2举例说明32.算数转换3.操作…...
【五六七人口普查】我国省市两级家庭户住房状况
人口数据是我们在各项研究中最常使用的数据!之前我们分享过第七次人口普查(简称七普)的数据!很多小伙伴拿到数据后都反馈数据非常好用,同时很多小伙伴咨询有没有前面几次人口普查的数据,这样方便做人口变化…...
大数据框架之Hadoop:入门(二)从Hadoop框架讨论大数据生态
第2章 从Hadoop框架讨论大数据生态 2.1 Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概念-Hadoop生态圈。 2.2 Hadoop发展历史 1&…...
负载均衡反向代理下的webshell上传+apache漏洞
目录一、负载均衡反向代理下的webshell上传1、nginx 负载均衡2、搭建环境3、负载均衡下的 WebShell连接的难点总结难点一、需要在每一台节点的相同位置都上传相同内容的 WebShell难点二、无法预测下次的请求交给哪台机器去执行。难点三、下载文件时,可能会出现飘逸&…...
打造安全可信的通信服务,阿里云云通信发布《短信服务安全白皮书》
随着数字化经济的发展,信息保护和数据安全成为企业、个人关注的焦点。近日,阿里云云通信发布《短信服务安全白皮书》,该白皮书包含安全责任共担、安全合规、安全架构三大板块,呈现了阿里云云通信在信息安全保护方面的技术能力、安…...
Python项目实战——外汇牌价(附源码)
前言 几乎每个人都在使用银行卡,今天我们就来爬取某行外汇牌价,获取我们想要的数据。 环境使用 python 3.9pycharm 模块使用 requests 模块介绍 requestsrequests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到&…...
String、StringBuffer、StringBuilder有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别? 今天我会聊聊日常使用的字符串,别看它似乎很简单,但其实字符串几乎在所有编程语言里都是个特殊的存在,因为不管是数量还是体积,字符串都是大多数应用中的重要…...
python基于django+vue的高铁地铁火车订票管理系统
目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 使用工具简介 4 2.2 环境配置 4 2.4 MySQL数据库 5 2.5 框架介绍 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可…...
全栈自动化测试技术笔记(一):前期调研怎么做
昨天下午在家整理书架,把很多看完的书清理打包好,预约了公益捐赠机构上门回收。 整理的过程中无意翻出了几年前的工作记事本,里面记录了很多我刚开始做自动化和性能测试时的笔记。 虽然站在现在的角度来看,那个时候无论是技术细…...
专家培养计划
1、先知道一百个关键词 进入一个行业,如果能快速掌握其行业关键词,你会发现,你和专家的距离在迅速缩短。 若不然,可能同事间的日常交流,你都会听得云里雾里,不知所云。 比如做零售,就要了解零售…...
583. 两个字符串的删除操作 72. 编辑距离
583. 两个字符串的删除操作 dp[i][j]:以i-1结尾的word1和j-1结尾的word2 变成相同字符串最少的步骤为dp[i][j] 初始化dp[i][0],dp[0][j]为空字符串和第一个字符匹配的最少步骤,即i/j,删除对应的字符个数。dp[i][0]i,dp[0][j]j; 遍历两个字符串。 若word1…...
[多线程进阶] 常见锁策略
专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1. 常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 读写…...
Scala - Idea 项目报错 Cannot resolve symbol XXX
一.引言 Idea 编译 Scala 项目大面积报错 Cannot resolve symbol xxx。 二.Cannot resolve symbol xxx 1.问题描述 Idea 内的 Scala 工程打开后显示下述异常: 即 Scala 常规语法全部失效,代码出现大面积红色报错。 2.尝试解决方法 A.设置 Main Sourc…...
信息化发展与应用的新特点
一、信息化发展与应用二、国家信息化发展战略三、电子政务※四、电子商务五、两化融合(工业和信息化)六、智慧城市 一、信息化发展与应用 我国在“十三五”规划纲要中,将培育人工智能、移动智能终端、第五代移动通信(5G)先进传感器等作为新…...
软件测试】测试时间不够了,我很慌?项目马上发布了......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 常见的几种情况&…...
MapReduce编程规范
MapReduce编程规范 MapReduce的开发一共有八个步骤,其中Map阶段分为2个步骤,Shuffle阶段4个步骤,Reduce阶段分为2个步骤。 Map阶段2个步骤 设置InputFormat类,将数据切分为Key-Value(K1和V1)对,输入到第二步。 自定义Map逻辑,将第一步的结果转换成另外的…...
Unity 如何实现游戏Avatar角色头部跟随视角转动
文章目录功能简介实现步骤获取看向的位置获取头部的位置修改头部的朝向限制旋转角度超出限制范围时自动回正如何让指定动画不受影响功能简介 如图所示,当相机的视角转动时,Avatar角色的头部会同步转动,看向视角的方向。 实现步骤 获取看向的…...
深度学习优化算法总结
深度学习的优化算法 优化的目标 优化提供了一种最大程度减少深度学习损失函数的方法,但本质上,优化和深度学习的目标不同。 优化关注的是最小化目标;深度学习是在给定有限数据量的情况下寻找合适的模型。 优化算法 gradient descent…...
CMake详细使用
1、CMake简介CMake是一个用于管理源代码的跨平台构建工具可以方便地根据目标平台和编译工具产生对应的编译文件主要用于C/C语言的构建,但是也可以用于其它编程语言的源代码。如同使用make命令工具解析Makefile文件一样cmake命令工具依赖于一个CMakeLists.txt的文件该…...
【数据结构与算法】前缀树的实现
🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…...
canvas 制作2048
效果展示 对UI不满意可以自行调整,这里只是说一下游戏的逻辑,具体的API调用不做过多展示。 玩法分析 2048 的玩法非常简单,通过键盘的按下,所有的数字都向着同一个方向移动,如果出现两个相同的数字,就将…...
playwright: 全局修改页面等待超时时间
等待超时时间默认是30s, 可以通过以下几个方法设置: browser_context.set_default_navigation_timeout()browser_context.set_default_timeout()page.set_default_navigation_timeout()page.set_default_timeout() set_default_navigation_timeout set_default_n…...
C++类和对象(中)
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 I do not believe in taking the right decision. I take a decision and make it right. 我不相信什么正确的决定。我都是先做决定,然后把…...
Docker安装EalasticSearch、Kibana,安装Elasticvue插件
使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境。 如果没有安装Docker的话,先在Linux上安装Docker。 有了Docker环境后,就可以使用Docker安装部署ES和Kibana了 一、安装ES 1、拉取EalasticSearch镜像 docker p…...
算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间
算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间 无重叠区间 435. 无重叠区间 - 力扣(LeetCode) 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互…...
c/c++开发,无可避免的文件访问开发案例
一、缓存文件系统 ANSI C标准中的C语言库提供了fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等标准函数,这些函数在不同的操作系统中应该调用不同的内核API,从而支持开发者跨平台实现对文件的访问。 在Lin…...
MySQL学习笔记
MySQL学习笔记一、基础配置二、数据库操作三、表的操作1.创建表2.表选项3.查看表4.修改表5.删除表6.复制表7.检查优化修复表四、数据操作基础增删改查五、字符集编码六、数据类型(列类型)1.数值类型2.字符串类型3.日期时间类型4.枚举和集合七、列属性&am…...
ccs导入工程失败的处理方法
文章目录当导入CCS新工程时出现下述错误怎么办?方法一 从TI官网下载安装包进行安装,下载链接:软件下载完成 安装路径为上面的文件夹点击安装完成后,导入安装路径,并点击Refresh按钮,依据路径进行更新&#…...
探针台常见的故障及解决方法
症状、 可能原因、 解决方法 移动样品后画面变模糊 —显微镜不垂直,调垂直显微镜 样品台不水平 —调水平样品台 显微镜视场亮度不足,边缘切割或看不到像—转换器不在定位位置上 把转换器转到定位位置上 管镜转盘不在定位位置上 —把管镜转盘转到定…...
域内资源探测
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是…...
学网站开发培训学校/免费b站推广网站2022
C语言—NYOJ上的几道水题 上周做完了NYOJ上的语言入门80题,虽然都是难度比较低的水题,但是有些较好的题还是想拿出来和大家分享一下,其中并不涉及数据结构和算法,希望能对大家有帮助。 1. 素数距离问题 描述 现在给出你一些数…...
asp.net网站登录/商业推广费用一般多少
前言 使用PaddlePaddle轻松实现语音合成,提供了简单的示例代码,GUI界面操作,还有Flask的Web接口,可以给Android调用。 源码地址:点击下载 视频教程地址:哔哩哔哩 首先来写一个简单的程序,通…...
用dw做一个个人网站/百度一下你就知道 官网
题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试平台根据新危险化学品经营单位安全管理人员考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编,组成一套危险化学…...
wordpress主机和域名绑定域名/关键词优化网站排名
昨天测试了一下mysqlpump,今天来把剩下的补充完成,算是一个小的系列。mysqlpump在MySQL5.7中做逻辑备份恢复有了一个新的工具mysqlpump,如果你掌握了mysqldump,那么使用mysqlpump就是分分钟的事情,因为很多参数都是很相似的&#…...
如何做视频购物网站/海口网站关键词优化
NoSQL Manager的安装和使用 https://www.cnblogs.com/TurboWay/p/8213656.html...
做我男朋友好不好网站/二级域名分发平台
几天前头儿要我实现程序能开机自动启动,搞好了,整理起来写下来。 private void checkBox1_CheckedChanged(object sender, EventArgs e){string path Directory.GetCurrentDirectory() "\LEDCOM.exe";//程序名RunWhenStart(checkBox1.Checke…...