C语言操作符详解(下)

news2024/11/29 8:52:24

提示:本篇内容是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
	//-126

	printf("%d\n", c);
	return 0;

}

在这里插入图片描述
解释:
1.计算的时候用补码来计算
2.short类型和char类型的两个数相加时要进行整形提升
3.整形提升是按照变量的数据类型的符号位来提升的
4.计算之后得到整形提升之后的补码,但是由于接收结果的类型是char类型,只能存储一个字节的数据(8个比特位),所以要截断,截断之后的8个比特位就是接收结果的变量的值
但是打印结果c的时候,char类型的数据要以%d的形式打印出来,这时候还要进行整形提升,提升之后的是它的补码,%d打印出来结果的值是原码

举例说明2

int main()
{
	//char类型的取值范围是:-128到127
	char a = 0xb6;
	//b6: 1011 0110
	short 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语言内容哦~🥰💕

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

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

相关文章

三子棋——【保姆级C语言小游戏】

前言&#xff1a;今天七七为大家带来的是C语言中比较简单的小游戏“三子棋” 下面跟着七七一起来学习吧&#xff01; 文章目录游戏整体思路游戏的实现流程游戏的实现菜单的打印创建与初始化棋盘玩家下棋电脑下棋判断输赢代码的整体运行游戏整体思路 我们需要三个文件&#xff…

Nginx 配置文件详细介绍

1、大致说明 Nginx 包含很多配置文件&#xff0c;但是主要配置文件是&#xff1a;/usr/local/nginx/conf/nginx.conf。去掉全部注释后&#xff0c;配置文件的主体结构为&#xff1a; worker_processes 1;events {worker_connections 1024; }http {include mime.types…

勒索病毒整体攻击态势简单分析

声明 本文是学习2018勒索病毒白皮书政企篇. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 勒索病毒整体攻击态势 2018年&#xff0c;勒索病毒攻击特点也发生了变化&#xff1a;2017年&#xff0c;勒索病毒由过去撒网式无差别攻击逐步转向以服务器定…

python(14)--集合

前言 本篇文章学习的是 python 中集合的基础知识。 集合元素的内容是不可变的&#xff0c;常见的元素有整数、浮点数、字符串、元组等。至于可变内容列表、字典、集合等不可以是集合元素。虽然集合不可以是集合的元素&#xff0c;但是集合本身是可变的&#xff0c;可以去增加或…

代码随想录算法训练营第六十四天_第十章_单调栈 | 84. 柱状图中最大的矩形

LeetCode 84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾勒出来的 矩形的最大面积。 视频讲解文章讲解https://programmercarl.com/0084.%E6%9F%B1%E7%8A%…

【MyBatis】| MyBatis的缓存

目录 一&#xff1a;MyBatis的缓存 1. ⼀级缓存 2. ⼆级缓存 3. MyBatis集成第三方缓存EhCache&#xff08;了解&#xff09; 一&#xff1a;MyBatis的缓存 &#xff08;1&#xff09;缓存(cache)&#xff1a;提前把数据存放到缓存当中&#xff0c;下一次使用的时候&#x…

谷歌浏览器无法自动更新怎么办

越来越多的小伙伴选择使用谷歌浏览器&#xff0c;近期有小伙伴发现谷歌浏览器突然无法自动升级更新了&#xff0c;这是怎么回事&#xff0c;遇到这种问题应该怎么解决呢&#xff0c;下面小编就给大家详细介绍一下谷歌浏览器无法自动更新的解决方法&#xff0c;大家感兴趣的话就…

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

C语言-程序环境和预处理(14.1)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段 2.2.1 预编译&#xff08;预处理&#xff09; 2.2.2 编译 2.2.3 汇编 2.2.4 链接 2.3 运行环境 写在最后&#xff1a; 1. 程序的翻译环境和执行环境 翻译环境&#xff1…

云借阅图书管理系统的测试项目实践

一、项目启动&#xff0c;介入了解需求二、需求分析三、制定测试方案&#xff08;计划 策略&#xff09;四、测试执行流程五、编写测试用例六、测试执行6.1 环境搭建6.2 准备工作6.3 执行6.4 缺陷管理七、输出测试报告八、版本发布九、项目总结一、项目启动&#xff0c;介入了…

CV【5】:Layer normalization

系列文章目录 Normalization 系列方法&#xff08;一&#xff09;&#xff1a;CV【4】&#xff1a;Batch normalization Normalization 系列方法&#xff08;二&#xff09;&#xff1a;CV【5】&#xff1a;Layer normalization 文章目录系列文章目录前言2. Layer normalizati…

【C++】多态详解

声明&#xff1a; 本节课件中的代码及解释都是在vs2013下的x86程序中&#xff0c;涉及的指针都是4bytes。如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是x64程序&#xff0c;则需要考虑指针是8bytes问题等等 文章目录多态的概念多态的定义及实现多态的…

Javaweb之Http协议andTomcatandServelt的内容~

JavaWeb技术栈&#xff1a; B/S架构;Browser/server:浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端&#xff0c;浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源发…

2023全球市场份额排名前五的浏览器,国产的为何没上榜

数据研究机构statcounter发布了PC端浏览器在2023年1月份的最新数据统计。Chrome浏览器凭借66.39%的全球份额稳居第一&#xff0c;Edge第二&#xff0c;Safari第三&#xff0c;Firefox第四&#xff0c;Opera第五。不难看出&#xff0c;在浏览器市场全球占有率排名前5中&#xff…

LeetCode 刷题系列 -- 304. 二维区域和检索 - 矩阵不可变

给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a;计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。实现 NumMatrix 类&#xff1a;NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初…

我去,竟可直接用命令行操作ChatGPT

ChatGPT 确实杀疯了&#xff0c;已经有 1亿 月活用户了&#xff0c;毕竟它真的有智能的样子。 我前些年还开发过智能客服系统&#xff0c;要是早点遇到 ChatGPT&#xff0c;估计可以省了不少事。 我想接下来有许多业务场景都会使用到它&#xff0c;比如教学&#xff0c;内容创…

OpenCV-PyQT项目实战(5)项目案例01图像模糊

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

毫米波雷达人体存在感应营造更智能的生活

毫米波雷达人体存在感应的工作原理基于多普勒效应&#xff0c;精准度高、稳定性强&#xff0c;其可以穿透非金属物质&#xff0c;比如薄木板、衣服、塑料等物质。 科技改变生活&#xff0c;营造更智能化的生活&#xff0c;最重要的是能够对人体存在进行精准检测&#xff0c;人体…

Git多人协同远程开发

1. 李四&#xff08;项目负责人&#xff09;操作步骤 在github中创建远程版本库testgit将基础代码上传⾄testgit远程库远程库中基于main分⽀创建dev分⽀将 githubleaflife/testgit 共享给组员李四继续在基础代码上添加⾃⼰负责的模块内容 2. 张三、王五&#xff08;组员&…

【树和二叉树】数据结构二叉树和树的概念认识

前言&#xff1a;在之前&#xff0c;我们已经把栈和队列的相关概念以及实现的方法进行了学习&#xff0c;今天我们将认识一个新的知识“树”&#xff01;&#xff01;&#xff01; 目录1.树概念及结构1.1树的概念1.2树的结构1.3树的相关概念1.4 树的表示1.5 树在实际中的运用&a…