C 程序设计教程(06)—— C 语言的运算符与表达式

news2024/11/19 16:33:11

C 程序设计教程(06)—— C 语言的运算符与表达式

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(06)—— C 语言的运算符与表达式
    • 一、算术运算
        • 1、算术运算符
        • 2、自增和自减
        • 3、算术表达式
    • 二、关系和逻辑运算
        • 1、关系运算符和逻辑运算符
        • 2、关系表达式
        • 3、逻辑表达式
    • 三、赋值运算
        • 1、赋值运算符
        • 2、复合赋值运算符
        • 3、赋值表达式
    • 四、位运算
    • 五、条件运算
    • 六、逗号运算

运算是对数据进行各种处理,用来表示各种不同运算的符号称为运算符。C 语言提供了丰富的运算符,包括:算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符等。

一、算术运算

1、算术运算符

C 语言中的算术运算符如下表所示:

运算符作用
+加法
-减法
*乘法
/除法
%模运算(求余)
自减(减1)
++自增(加1)

说明:

(1)除法(/)用于整数和字符时,结果取整。

(2)模运算(求余)符不能用于 float 和 double 类型。

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	int a=12,b=5; 
	float f1=12.0,f2=5.0; 
	printf("%d\n",a/b); 
	printf("%f\n",f1/f2);
	printf("%d\n",a%b);
    return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

2、自增和自减

自增(++)使操作数加1,自减(–)使操作数减 1。自增和自减运算符可以放在操作数之前(如:++x),也可以放在操作数之后(x++)。

如果自增和自减运算符在操作数之前,在引用操作数之前先执行加 1 或减 1 操作。如果自增和自减运算符在操作数之后,则先引用操作数的值,然后进行加 1 或减 1 操作。

例如:

#include <stdio.h>
#include <string.h>
int main()
{
	int x=10,y=10,z; 
	z=++x;
	printf("x=%d,  z=%d\n",x,z); 
	z=y++;
	printf("y=%d,  z=%d\n",y,z);
    return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

算术运算符的优先级:(++、–)、-(负号)、(*、/、%)、(+、-)

3、算术表达式

用算术运算符、圆括号将运算对象(又称为操作数)连接起来符合 C 语言语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。

算术表达式书写时的注意事项:

(1)乘号不能省略。例如:4ab 应写作 4*a*b;

(2)只能使用系统允许的标识符。例如:2πr 应写作 2*3.1415926*r;

(3)不允许使用方括号和花括号,只能使用圆括号限定运算次序。可以使用多层圆括号,但左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。

例如:

#include <stdio.h>
#include <string.h>
# define PI 3.1415926
int main()
{
	float r; 
	printf("请输入圆的半径:");
	scanf("%f",&r); 
	printf("圆的周长为:%f\n",2*PI*r); 
	printf("圆的面积为:%f\n",PI*r*r); 
    return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

二、关系和逻辑运算

1、关系运算符和逻辑运算符

关系运算符中的“关系”指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”指的是连接关系的方式。

在 C 语言中,非 0 为 TRUE,0 为 FALSE。关系表达式与逻辑表达式的返回值为 0(FALSE) 或 1(TRUE)。关系运算符和逻辑运算符如下表所示:

关系运算符含义逻辑运算符含义
>大于&&
>=大于或等于||
<小于!
<=小于或等于
==等于
!=不等于

关系运算符和逻辑运算符的优先级:!、(>、>=、<、<=、==、!=),&&,||

2、关系表达式

关系表达式是指用一个关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式或字符表达式等)连接起来,进行关系运算的式子。关系表达式的值是一个逻辑值。例如:

#include <stdio.h>
int main()
{
	int x=3,y=4,z=5; 
	printf("x>y:%d\n",x>y);//逻辑值假用0表示
	printf("(x>y)!=z:%d\n",(x>y)!=z);//逻辑值真用1表示
	printf("x<y<z:%d\n",x<y<z);//x<y为1,1<5为真 
	printf("(x<y)+z:%d\n",(x<y)+z);//x<y为1,1+5=6
    return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

3、逻辑表达式

逻辑表达式是用逻辑运算符将一个或多个表达式连接起来,进行逻辑运算的式子。通常用逻辑表达式表示多个条件的组合。

例如:

#include <stdio.h>
int main()
{
	int year1=2000,year2=2100,result1,result2;
	int num=12;
	result1=(year1%4==0)&&(year1%100!=0)||(year1%400==0);
	result2=(year2%4==0)&&(year2%100!=0)||(year2%400==0);
	printf("2000年是否闰年:%d\n",result1);
	printf("2100年是否闰年:%d\n",result2);
	printf("!num:%d\n",!num);
	printf("num||num>20:%d\n",num||num>20);
	printf("num>=1&&num<31:%d\n",num>=1&&num<31);
    return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

三、赋值运算

1、赋值运算符

赋值符号 = 称为赋值运算符,将赋值运算符右边的表达式的值存储到以左边变量名为标识的变量中。赋值运算的格式为:

<变量>=<表达式>;

说明:

(1)赋值运算符的左边必须是变量,右边的表达式可以是常量、变量、表达式和函数。

例如:

x = 10;
y = x + 10;
y = func();

(2)赋值符号不同于等号(C 语言等号用 == 表示),它没有相等的含义。例如:x=x+1 表示取出变量 x 的值加 1 后,再存入变量 x 中。

(3)在一个赋值过程中,可以出现多个赋值运算符,其运算顺序是从右向左。例如:

#include <stdio.h>
int main()
{
	int x,y,z;
	x=y=z=2;
	printf("z=%d\n",z);  //先执行:z=2
	printf("y=%d\n",y);  //把赋值表达式(z=2,结果为2)的值赋给y 
	printf("x=%d\n",x);  //把赋值表达式(y=2,结果为2)的值赋给x 
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

2、复合赋值运算符

可以在赋值运算符 = 之前加上其他运算符,构成复合赋值运算符。所有的双目运算符都可以与赋值运算符一起组合成复合赋值运算符。格式为:

<变量><双目运算符>=<表达式>;
//等价于:
<变量>=<变量><双目运算符>=<表达式>;
//复合赋值运算符一共有10种
//+=、-=、*=、/=、%=、<<=、>>=、&=、^=、||=

例如:

#include <stdio.h>
int main()
{
	int x = 2;
	x += 10;
	printf("x:%d\n",x);  //x=12
	x -= 2;
	printf("x:%d\n",x);  //x=10
	x *= 4;
	printf("x:%d\n",x);  //x=40
	x /= 2;
	printf("x:%d\n",x);  //x=20
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

3、赋值表达式

由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。格式如下:

<变量>=<表达式>;

赋值表达式求解的过程如下:

(1)先求解赋值表达式右边的表达式的值。

(2)将赋值运算符右侧表达式的值赋给左侧的变量。

(3)赋值表达式的值就是被赋值变量的值。

例如:赋值表达式 a=5 的值为 5,变量 a 的值也是 5。

(4)赋值表达式中的表达式也可以是一个赋值表达式。例如:

#include <stdio.h>
int main()
{
	int x,y,z;
	x=y=5;
	printf("y=%d\n",y);  //把赋值表达式(z=2,结果为2)的值赋给y 
	printf("x=%d\n",x);  //把赋值表达式(y=2,结果为2)的值赋给x 
	z=(x=4)+(y=3); 
	printf("z=%d\n",z);  //赋值表达式(x=4,结果为4),赋值表达式(y=3,结果为3)
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

(5)赋值表达式也可以包含复合的赋值运算符。例如:

#include <stdio.h>
int main()
{
	int x=12,y;
	y=x+=x-=x*x;
	//(1)先执行 x-=x*x,x=12-144=-132 
	//(2)再执行x+=-132,x=-132-132=-264 
	//(3)把-264赋给y 
	printf("y=%d\n",y);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

四、位运算

位运算是对字节或字中的位(bit)进行测试、置位或移位处理,字节或字针对 char 和 int 数据类型。位运算不能用于 float、double、long double、void 或其他复杂类型。位运算符如下:

运算符含义
&位与(AND)
|位或(OR)
^异或(XOR)
~取反
>>右移
<<左移

移位运算符(>> 和 <<)将变量的各位按要求向右或向左移动。

右移语句形式为:变量>>右移位数

左移语句形式为:变量<<左移位数

左移一位等效于乘 2,右移一位等效于除 2。例如:

#include <stdio.h>
int main()
{
	int x=8,y,z;
	y=x<<1;	
	z=x>>1;
	printf("y=%d\n",y);
	printf("z=%d\n",z);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

五、条件运算

C 语言提供了一个可以代替某些 if…then…else 语句的运算符 【?:】(条件运算符),格式为:

exp1?exp2:exp3;

说明:

(1)exp1 为逻辑表达式或关系表达式。

(2)如果 exp1 的值非 0,则计算 exp2,并将 exp2 的结果作为整个表达式的值。如果 exp1 的值为 0,则计算 exp3 的值,并将 exp3 的结果作为整个表达式的值。例如:

#include<stdio.h>
int main()
{
	int x=5,y=10;
	printf("%s\n",x%2==0?"偶数":"奇数");
	printf("%s\n",y%2==0?"偶数":"奇数");
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

六、逗号运算

逗号运算符(,)将若干个表达式连接起来构成一个逗号表达式,格式为:

表达式1,表达式2,...,表达式n;

求解过程为:自左向右,先求解表达式1,再求解表达式2,…,最后求解表达式n,表达式n的值就是整个逗号表达式的值。

例如:

#include<stdio.h>
int main()
{
	int x,y;
	y=x=4*3,x*5,x+10; //计算4*3=12,将12赋给x,计算x*5=60,x+10=22,整个表达式的值为22 
	printf("%d\n",y);
	return 0;
}

以上程序的运行结果如下:

在这里插入图片描述

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

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

相关文章

【每日一题】【LeetCode】【第七天】盛最多水的容器

解决之路 因为是周日&#xff0c;找个中等题挑战一下。 题目描述 测试案例&#xff08;部分&#xff09; 第一次 想一下&#xff0c;因为涉及到底乘高&#xff0c;所以不能排序。逆序也没必要。 简化一下题干&#xff0c;盛水最多&#xff0c;也就是算面积最大&#xff0c…

【北邮果园大三上】运筹学期中前

第一章.线性规划 1.1例题 根据现实世界中的问题建立模型 一般表达式 ①和式 ②向量式 1.2变化标准&#xff1a; 1.3线性规划求解的基础原理和单纯解法 1.3.1解 ①基础概念 基 可行解与基础解 其他分类 ②判断举例 原式子&#xff1a; 判断标准 将一个未知数作为常熟&#…

从Wireshark看TCP连接的建立与关闭

http://t.zoukankan.com/jonathanlin-p-4282582.html TCP是一种面向连接、可靠的协议。TCP连接的建立与断开&#xff0c;都是需要经过通信双方的协商。用一句话概括就是&#xff1a;三次握手say hello&#xff08;建立连接&#xff09;&#xff1b;四次握手say goodbye&#x…

蓝桥杯Python组排序算法与函数

目录 一、排序算法 二、排序函数 1、Python 的 sort() 函数和 sorted() 函数 2、sort() 例子 3、sorted() 例子 4、部分排序 三、例题 1、统计数字&#xff08;lanqiaoOJ题号535&#xff09; 2、错误票据&#xff08;lanqiaoOJ题号205&#xff09; 3、奖学金&#xf…

线程池 - ThreadPoolExecutor 详解

线程池 - ThreadPoolExecutor 详解 线程池 ThreadPoolExecutor 源码解析参考 juc 专栏系列文章。 基本概述 线程池&#xff1a;一个容纳多个线程的容器&#xff0c;容器中的线程可以重复使用&#xff0c;省去了频繁创建和销毁线程对象的操作。 线程池作用&#xff1a; 降低资…

【基础】Elasticsearch 基础

Elasticsearch 基本概念及使用Elasticsearch 基本概念ES 的简介及使用场景ES 基本概念ES 与 Kibana 的安装Elasticsearch 分词器ES 内置分词器ik 分词器的安装和使用Elasticsearch 基本使用索引操作数据的增删改查DSL 查询聚合查询批量操作Elasticsearch 基本概念 ES 的简介及…

多线程锁相关

日升时奋斗&#xff0c;日落时自省 目录 1、常见的锁策略 1.1、悲观锁vs乐观锁 1.2、轻量级锁vs重量级锁 1.3、自旋锁vs挂起等待锁 1.4、互斥锁vs读写锁 1.5、公平锁vs非公平锁 1.6可重入锁vs不可重入锁 2、CAS 2.1、CAS解析 2.2、CAS的应用场景 2.2.1、实现原子类 …

JavaSE学习day2_03, 算数运算符

5. 算术运算符 5.1 分类&#xff1a; - * / % 5.2 细节&#xff1a; 1.运算规则。跟小学数学是一模一样的 2.如果是整数跟整数进行计算&#xff0c;结果只能是整数。直接去掉小数部分&#xff0c;保留整数。如5/22,而不是2.5. 3.如果想要结果中有小数&#xff0c;需要有小…

(二)K8S Namespace 和 Label

Namespace 1、K8S集群中默认的Namespace为default&#xff0c;通过Namespace可以实现Pod之间的相互隔离&#xff08;如测试环境、生成环境的隔离&#xff09; 2、通过K8S的资源配置机制限定不同的Namespace对CPU、内存的使用&#xff0c;再通过K8S授权机制将不同的Namespace交…

启动ruoyi框架(初学)

启动ruoyi框架&#xff08;初学&#xff09;&#xff08;RuoYi&#xff09; Ruo Yi启动ruoyi框架&#xff08;初学&#xff09;&#xff08;[RuoYi](http://doc.ruoyi.vip/)&#xff09;一、简介二、项目启动1.前端模组&#xff1a;RUOYI-UI2.后端模组&#xff1a;3.环境要求&a…

Java版阿里云/腾讯云域名动态映射DDNS到动态IPv4或IPv6

1 介绍 利用业余时间&#xff0c;整合了一下阿里云和腾讯云动态域名映射&#xff0c;并将其使用spring boot做了一下封装&#xff0c;正好可以把家里的闲置电脑和IP v6利用起来&#xff0c;具体使用方法如下&#xff0c;或者参考对应项目的readme文档 2 地址 aliyun-ddns&am…

数据分析-深度学习 Day3

youtube课程地址&#xff1a;&#xff08;实时更新&#xff09;https://www.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2Jwww.youtube.com/playlist?listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2JB站课程地址&#xff1a;李宏毅2021机器学习【week3】&#xff1a…

基于tensorflow框架bert的自然灾害描述文本分类详细教程

概述: 使用tensorflow框架: 预测给定的推文是否与真正的灾难有关。如果是这样,预测一个1。如果不是,预测一个0 数据展示:

Java之String概述、对象创建原理和常见面试题、String类常用API、案例

目录String、ArrayList前言String简单介绍Arraylist简单介绍String 概述String类的特点详解总结String类创建对象的两种方式两种方式有什么区别吗&#xff1f;总结String常见面试题String类常用API-字符串内容比较总结String类常用API-遍历、替换、截取、分割操作String案例验证…

内存管理(C/C++)

内存管理&#xff08;C/C&#xff09;C/C内存分布C语言中的动态内存管理方式C中动态内存管理new / delete 操作内置类型new 和 delete 操作自定义类型operator new 和 operator delete 函数operator new 和 operator delete 函数new 和 delete 的实现原理内置类型自定义类型定位…

【人工智能原理自学】激活函数:给机器注入灵魂

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 &#x1f514;本文讲解激活函数&#xff1a;给机器注入灵魂&#xff0c;一起卷起来叭&#xff01; 目录一、“分…

已解决pandas正确创建DataFrame对象的四种方法(通过list列表、dict字典、ndarray、Series对象创建)

已解决&#xff08;pandas创建DataFrame对象失败&#xff09;ValueError: 4 columns passed, passed data had 2 columns 文章目录报错代码报错翻译报错原因解决方法创建DataFrame对象的四种方法1. list列表构建DataFrame2. dict字典构建DataFrame3. ndarray创建DataFrame4. Se…

【MySQL】十一,存储引擎

查看存储引擎 查看mysql提供什么存储引擎 设置系统默认的存储引擎 查看默认的存储引擎 show variables like %storage_engine%; SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存储引擎的话&#xff0c;那就会默认使用 InnoDB 作…

08、ThingsBoard使用msa构建镜像并上传到Harbor

1、概述 今天讲解如何使用thingsboard源码中的msa模块来构建镜像,首先我先说一下这个模块的作用,很多人都不明白msa是如何构建镜像的,msa下面创建了很多模块,每个模块都是一个应用,就像我们平时微服务一样可以独自启动,thingsboard是使用这些模块去其它模块拉取代码过来…

卷积神经网络 Convolutional Neural Network (CNN)

CNNObservation 1Observation 2Benefit of Convolutional LayerMultiple Convolutional LayersComparision of Two StoriesObservation 3Convolutional Layers PoolingApplication: Playing GoTo learn more ...仅供个人学习&#xff0c;不具参考价值&#xff01; Image Class…