C语言——运算符及表达式

C语言——运算符及表达式

  • 运算符
    • 运算符的分类
    • ++(自增运算符)、--(自减运算符)
    • 赋值运算符
    • 逗号运算符(顺序求值运算符)
  • 表达式

运算符

运算符的分类

C语言的运算符范围很宽,除了控制语句和输入输出以外的几乎所有的基本操作都可以作为运算符处理。通过查阅课本可知运算符的分为以下13类:
在这里插入图片描述
我下面主要要讲述的是算术运算符、赋值运算符、以及逗号运算符;

算数运算符
算术运算符总共有+(加法运算符) 、-(减法运算符) 、*(乘法运算符) 、/(出发运算符) 、%(求余运算符) 五种,要想了解算数运算符及运算符的使用必须先要了解运算符的优先级和结合性;
那么什么时候会用到运算符的的优先级呢?
就是在不同优先级的运算符混合在一起使用的时候高优先级的会先结合;
结合性,所谓结合性就是运算符的结合方向,不同的运算符都有着不同的结合方向,当同一优先级的运算符混合时运算符会按照结合性结合。
运算符的优先级和结合性如下表所示:
在这里插入图片描述
算数运算符的用法和数学上了类似,需要注意的是求余运算符(%):
求余运算的规则
1、求余运算中运算数不能是小数,必须是整数;
2、除数不能为零;
3、结果的符号取决于左操作数;
那何为左操作数呢?
左操作数也就是左值,通俗来说就是能够放在表达式左边的变量,左值的定义是可定位的变量也就是可以在内存空间中找到相应的内存空间。
和左值相反的是右值,右值是不可定位的也就是在内存空间中找不到相应的空间;
常见求余运算符的用法:%2用于求偶数和奇数;%N可以取出在0~N - 1范围内的数,等等;
在产生一定范围内的随机数时也可以用到求余运算符,例如:

#include <stdio.h>int main(void)
{int i = 0;srand(time(NULL));for(i = 0; i < 10; ++i){printf("%d\n", rand() % 100);}return 0;
}

rand()产生的其实是伪随机数也就是产生的第一组数据是随机的如果再将程序执行一遍时打印的数字和上次打印的数据是一样的,原因是rand()起初含有一个默认的种子如果不改变种子输出的就是一样的数据,而srand()的作用就是给rand()种下一个种子把time(NULL)(返回值是秒的数值)作为参数传进srand(),这样以变化的时间来作为种子就不断的产生不是每次全部都一样的随机数了。

++(自增运算符)、–(自减运算符)

++自增运算符的常见用法:++i、i++;
i++先用后加前提是i++要参与到别的运算中才会起作用;
i++的值在内存中是这样存储的:
假设i在内存中占四个字节,i本身的值占用上面的四个字节并且会在其下面开辟出一块临时的空间用于存放表达式也就是i++的值;
在这里插入图片描述

++i也就是常说先加后用,这个先加后用的前提是++i要参与到别的运算中才会起作用;
和i++不同的是++i本身的值和表达式的值都是存放在同一块空间内的,所以说++i的效率更高,因为++i不用开辟额外的空间。
–自减运算符和自增运算符同理;

自增运算符问题:

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

问输出结果是什么?
这里程序会报错,原因是C语言编译器在处理时会从左往右逐个扫描,将字符尽可能多的结合成C语言运算符,所以遇到第一个+时没有运算符结合,遇到第二个+和第一个+结合成++,遇到第三个+无法和++结合,遇到第四个+和第三个+结合成++,遇到第五个+无法和++结合自己作为单个运算符所以i+++++i表达使得结合性是这样的最后(((i++)++)+i),因为i++是一个表达式,表达式为右值( )++缺左值所以程序会报错。

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

在实际的应用中是不建议这样使用的,因为在多数系统中的函数传参顺序是从右往左的而且i++先用后加到底什么时候加没有统一的规定。推荐用法如下:

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

赋值运算符

赋值运算符常见用法:

int a = 0int a = b = c = d = 0;

当只有赋值运算符时只用考虑结合性,即从右往左。
不同类型间的赋值:
高精度 = 低精度例如float、double赋值给int类型这样会导致精度丢失,反之将低精度赋值给高精度类型比如把int赋值给float、double类型会发生精度提升,所以在进行赋值运算时要看清楚数据类型否则输出结果可能会和预想结果哦不一致。
整型赋值规则:
int => short
long => int
short => char
长类型=>短类型 //高位截断

int a = 0x12345678;
short b = a;
printf("%#x\n", b);

长类型赋值给短类型 ,会发生高位截断,输出结果是0x5678;
短类型=>长类型
无符号短类型 =>长类型 //高位补0

short a = 0x1234;
int b = a;
printf("%#x\n", b);

无符号短类型 赋值给长类型高位补0,输出结果为0x1234;

有符号短类型 =>长类型 //符号位扩展 (高位补符号位)

short a = 0x8234;
int b = a;
printf("%#x\n", b);

符号短类型赋值给长类型符号位会扩展 即高位补符号位,输出结果为0xffff8234。

逗号运算符(顺序求值运算符)

语法:
表达式1,表达式2,…,…,…
逗号表达式整个表达式的值是最后一个表达式的值,比如:

int a = 10;
int b = (1 + 2, a++, 3 + 4);

b的值就是3 + 4这个表达式的结果即7;

表达式

表达式就是由运算符和运算数构成字符序列且表达式都是有值的和数据类型的 。
讲到表达式需要注意的是数据类型的转换特别是隐式类型的转换,
在这里插入图片描述
横向的箭头表示必定的转换字符型(char)和短整型(short)在运算时必须先转换为整型(int),float型数据必须先转换为double型的数据,这样做的目的是提高运算精度。
纵向的箭头表示的是当运算对象为不同数据类型时的转换方向,例如int和double的数据类型进行运算时需要将int转换为double类型。
需要注意的时箭头方向只表示数据类型的高低由低往高转,不是表示int先转换为unsigned int 在转换为long再转换为double。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何安装python

以下的安装仅针对Windows10系统 一、下载python和解释器 解释器下载 第一步&#xff0c;找到下载的地方 1.找到官网 2.直接点击地址链接 Python Release Python 3.7.2 | Python.org 第二步&#xff0c;找到对应的版本进行安装 进入页面之后&#xff0c;下滑&#xff0c;…

【学术会议征稿】第六届土木建筑与城市工程国际学术会议(ICCAUE 2024)

第六届土木建筑与城市工程国际学术会议&#xff08;ICCAUE 2024&#xff09; 2024 6th International Conference on Civil Architecture and Urban Engineering (ICCAUE 2024) 第六届土木建筑与城市工程国际学术会议&#xff08;ICCAUE 2024&#xff09;将于2024年11月15-17…

学习008-02-04-08 Localize UI Elements(本地化UI元素)

Localize UI Elements&#xff08;本地化UI元素&#xff09; This lesson explains how to localize an XAF application. It describes how to translate UI elements into German and create a multi-language application. 本课介绍如何本地化XAF应用程序。它描述了如何将U…

二次开发必备:开源在线海报图片设计器——poster-design

一、介绍 poster-design是一个最酷的开源在线海报图片设计器&#xff0c;漂亮易用且功能强大。它适用于多种场景&#xff1a;海报图片生成、电商分享图、文章长图、视频/公众号封面等&#xff0c;无需下载软件即可轻松实现创意、迅速完成排版。使用Vue3 、Vite5 、Vuex 、Elem…

Vite + Vue3 + TS项目配置前置路由守卫

在现代前端开发中&#xff0c;使用 Vue 3 和 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具&#xff0c;可以显著提升开发体验。本文博主将指导你如何在 Vite Vue 3 TypeScript 项目中配置前置路由守卫&#xff08;Navigation Guards&#xff09;…

使用JavaFx Fxml笔记

使用JavaFx Fxml实现账号密码登录 HelloApplication.java&#xff1a;package com.example.dr295cmonth7;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; i…

敏感信息泄露wp

1.右键查看网页源代码 2.前台JS绕过&#xff0c;ctrlU绕过JS查看源码 3.开发者工具&#xff0c;网络&#xff0c;查看协议 4.后台地址在robots,拼接目录/robots.txt 5.用dirsearch扫描&#xff0c;看到index.phps,phps中有源码&#xff0c;拼接目录&#xff0c;下载index.phps …

##__VA_ARGS__的作用

参考文章:https://blog.csdn.net/u013073067/article/details/125356313 ##__VA_ARGS__前面加上##的作用是&#xff1a;当可变参数的个数为0时&#xff0c;这里的##可以把把前面多余的","去掉,否则会编译出错。 在linux内核中随处可见这种宏定义的用法 #include &…

AttributeError: ‘str‘ object has no attribute ‘decode‘

AttributeError: ‘str‘ object has no attribute ‘decode‘ 目录 AttributeError: ‘str‘ object has no attribute ‘decode‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#x…

国科大作业考试资料《人工智能原理与算法》2024新编-第十三次作业整理

1、假设我们从决策树生成了一个训练集&#xff0c;然后将决策树学习应用于该训练集。当训练集的大小趋于无穷时&#xff0c;学习算法将最终返回正确的决策树吗&#xff1f;为什么是或不是&#xff1f; 本次有两个参考&#xff1a; 参考一&#xff1a; 当训练集的大小趋于无穷…

PVE环境中调整虚拟机磁盘大小

我的希望将PVE中的虚拟机磁盘调整一下&#xff0c;增加20GB。在查询了一些资料后&#xff0c;做一下总结教程。 环境是 PVE8.2.2 版本&#xff0c;虚拟机系统是centos7.9.2009-minimal&#xff0c; 安装系统时划分磁盘分区方式是默认分区方式&#xff08;不同分区方式下&#…

聊聊RNN与Attention

前言 Attention Mechanism&#xff0c;称为注意力机制。基于Attention机制&#xff0c;seq2seq可以像我们人类一样&#xff0c;将“注意力”集中在必要的信息上。 Attention的结构 seq2seq存在的问题 seq2seq中使用编码器对时序数据进行编码&#xff0c;然后将编码信息传递…

playbooks 分布式部署 LNMP

1、环境配置 ansible 服务器 192.168.10.10nginx 服务器 192.168.10.20mysql 服务器 192.168.10.21php 服务器 192.168.10.22 2、安装 ansble #192.168.10.10节点 yum install -y epel-release #先安装 epel 源 yum install -y ansible配置主机清单 …

弹幕背后:B站UP主创作服务解析

引言 在B站&#xff0c;每一条飘过的弹幕都是一个故事的碎片&#xff0c;它们汇聚成一幅幅生动的社交画卷。这里&#xff0c;不仅仅是一个视频分享平台&#xff0c;弹幕背后更是一个充满活力的创作者生态系统。B站以其独特的弹幕文化&#xff0c;为创作者和观众之间搭建起了一座…

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…

设计模式14-享元模式

设计模式14-享元模式 由来动机定义与结构代码推导特点享元模式的应用总结优点缺点使用享元模式的注意事项 由来动机 在很多应用中&#xff0c;可能会创建大量相似对象&#xff0c;例如在文字处理器中每个字符对象。在这些场景下&#xff0c;如果每个对象都独立存在&#xff0c…

三种使用 RocketMQ 达到消息一致的最佳实践

引言 Hi 你好&#xff0c;我是有清 RocketMQ 作为一款消息中间件&#xff0c;它的信息的投递与消费&#xff0c;通常都会与数据库的更新进行挂钩&#xff0c;那么如何保证 消息和数据库的更新是一个原子性的操作呢&#xff1f; 比如在我数据库更新失败的时候&#xff0c;不进行…

学习测试12-车(略)

系统讲解&#xff0c;可以在懂车帝网站去了解汽车结构

用AI做玄学壁纸!多篇笔记爆火,直接变现,轻松日入1000+

玄学是这两年赚钱的大风口&#xff0c;特别是80后、90后和00后这些年轻一代&#xff0c;他们对于个人财运、事业发展、爱情关系以及健康状态的预测和优化表现出浓厚的兴趣&#xff0c;希望通过这些方式来提升生活质量和实现个人目标。 今天就来给大家拆解其中一个赛道—用AI做…