运算符和表达式

表达式

表达式是由运算符、运算量和标点符号组成的有效序列,其目的是用来说明一个计算过程,表达式可以独立成句,一般形式为:

表达式;

运算符

运算符可以按照功能分为:算术运算符赋值运算符关系运算符逻辑运算符位运算符其他运算符

算术运算符

算术运算符有:+  -  *  /  %  ++  --

除法(/)

除法规则:整数相除,向下取整。

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char const * argv[])
{
    int a=3/2;
    float b=3/2;
    float c=3.0/2;
    printf("a=%d b=%f c=%f\n",a,b,c);
    reutrn 0;
}

以上代码的输出结果为:

整除(%)

整除规则:只能用于整数运算,取余数。

将12345的个十百千万位分别输出到终端

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const * argv[])
{
    int number=12345;
    int w,q,b,s,g;
    w=number/10000;
    q=number/1000%10;
    b=number/100%10;
    s=number/10%10;
    g=number%10;
    printf("%d %d %d %d %d\n",w,q,b,s,g);
    reutrn 0;
}

以上代码输出结果为:1  2  3  4  5

 自增(++)和自减(--)

int a=0;

a++;

++a;

以上两条都相当于a=a+1;

int a=1,b=1;
a++;
++b;
printf("%d %d\n",a,b);  //2 2
int a=0;

a--;

--a;

以上两条都相当于a=a-1;

自加和自减规则:

++或--在前时,先进行++或--操作再进行赋值打印;

++或--在后时,先进行赋值打印再进行++或--操作;

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const *argv[])
{
    int a=1,b=1;
    printf("%d %d\n",++a,b++);  //2 1
    printf("%d\n",b);  //2
    /*相当于
    printf("%d\n",b);
    b++;
    */
    return 0;
}

赋值运算符

赋值运算符有:=  +=  -=  *=  /=

++或--在前时,先进行++或--操作再进行赋值打印;

++或--在后时,先进行赋值打印再进行++或--操作;

例如:

z=++x + y++;

相当于:

x=x+1;

z=x+y;

y=y+1;

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const *argv[])
{
    int x=1,y=2,z=0;
    z=++x+y++;
    printf("x=%d y=%d z=%d\n");  //2 3 4
    return 0;
}

以上输出结果为:x=2 y=3 z=4

加等于(+=)

a+=2相当于a=a+2

同理,a-=2相当于a=a-2,a*=相当于a=a*2,a/=2相当于a=a/2

#include <stdio.h>
#include <stdlib.h>

int main(int argc,cahr const * argv[])
{
    int a=10;
    int b=a++;  //b=10,a=11
    int c=a+b;  //c=21,b=10,a=11
    int d=(b++)+c;  //b=11,c=21,d=10+21=31
    printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
    return 0;
}

以上输出结果为:a=11  b=11  c=21  d=31

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const * argv[])
{
    int a=10;
    int b=++a;  //b=11,a=11
    int c=a+(b++);  //a=11,c=11+11=22,b=12
    int d=b+c;  //b=12,c=22,d=12+22=34
    printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
    return 0;
}

以上输出结果为:a=11  b=12  c=22  d=34

关系运算符

关系运算符有:>  >=  <  <=  ==  !=

关系运算符是用来判断两者的关系,如果满足判断条件返回真,如果不满足返回假

运算符名称示例功能缩写
<小于a<ba小于b时返回真,否则返回假LT
<=小于等于a<=ba小于等于b时返回真,否则返回假LE
>大于a>ba大于b时返回真,否则返回假GT
>=大于等于a>=ba大于等于b时返回真,否则返回假GE
==等于a==ba和b相等时返回真,否则返回假EQ
!=不等于a!=b不等于b时返回真,否则返回假NE

逻辑运算符

逻辑与(&&)

逻辑与的规则:全真则真,一假则假

逻辑或( || )

逻辑或的规则:一真则真,全假则假

逻辑非( !)

逻辑非的规则:非真为假,非假为真

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const *argv[])
{
    int a=2,b=3;
    printf("%d\n",0&&1);
    printf("%d\n",0||0);
    printf("%d\n",(a<=b)&&(a==2));
    printf("%d\n",!(a>b));
    return 0;
}

以上输出结果为:

0

0

1

1

 短路法则(截断法则)

逻辑或( || )运算中:

如果前面的表达式为真,则后面的表达式不用执行,结果为真。

逻辑与(&&)运算中:

如果前面的表达式为假,则后面的表达式不用执行,结果为假。

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const *argv[])
{
    int a=5,b=6,c=7,d=8,m=2,n=2;
    int r=(m=a<b)||(n=c<d);
    printf("%d %d %d\n",m,n,r);
    //用到了短路法则,逻辑或(||)前面公式判断为真后面不执行,结果为真
    r=(m=a>b)&&(n=c<d);
    printf("%d %d %d\n",m,n,r);
    //用到了短路法则,逻辑与(&&)前面公式判断为假后面不执行,结果为假
    return 0;
}

以上输出结果为:

1  2  1

0  2  0

 题目:

给出一个年份,判断是平年还是闰年,如果是闰年打印1,如果是平年打印。

提示:

        闰年和平年的区别就是闰年的二月份比平年的二月份多一天。判断闰年还是平年的依据:

        普通年份除以4,有余数的是平年,没有余数的是闰年;

        整百年份除以400,有余数的是平年,没有余数就是闰年。

思路:

        可以设置一个标志位flag来接收是平年还是闰年的结果,然后用逻辑运算来判断是平年还是闰年,最后打印出来flag

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int flag=0,year;
    scanf("%d",&year);
    flag=((year%4==0&&year%100!=0) || (year%400==0));
    printf("%d\n",flag);
    return  0;
}

位运算符

含义C语言表达式
按位与a&b
按位或a | b
按位异或a ^ b
按位取反~ a
左移a<<b(a左移b位)
右移a>>b(a右移b位)
无符号右移/

需要注意的是,负数都是用补码进行运算

位与(&)

位与规则:全1则1,有0则0

例如:

5&6

        0000 0101

     & 0000 0110

 ————————

        0000 0100

位或(|)

位或规则:有1则1,全0则0

例如:

5| 6

        0000 0101

     |  0000 0110

 ————————

        0000 0111

位异或(^)

位异或规则:不同为1,相同为0

例如:

15| 16

        0000 1111

     |  0001 0000

 ————————

        0001 1111

按位取反(~)

按位取反规则:按位取反,0变1,1变0

原码反码补码
正数正数本身正数本身正数本身
负数负数本身除符号位外,其余按位取反反码+1

例如:

~15:

        0000 1111

~ ———————

        1111 0000

~-1:

        1000 0001

~ ———————

         1111 1110

原码反码补码
10000 00010000 00010000 0001
-151000 11111111 00001111 0001

左移(<<)

左移规则:左移几位,右边补几个0

例如:

8<<2:        ==>        0000 1000<<2

==>  0010 0000=32

-5<<3:

原码:1000 0101

反码:1111 1010

补码:1111 1011

<<3:        ==>        1101 1000  //负数用补码计算

左移后的原码:1010 1000=-40

右移(>>)

右移规则:右移几位,左边补几个符号位(即正数补0,负数补1)

例如:

8 >> 2:

0b 0000 1000 >> 2

0b 0000 0010=2

-10 >> 3:

原码:1000 1010

反码:1111  0101

补码:1111  0110

>>3:        ==>        1111 1110//负数用补码计算

左移后的原码:1000 0000=-2

置一公式和置零公式

置一公式:a | (1<<n)

置零公式:a&(~(1 << n))

int a=0b0111;
printf("%d\n",a|(1<<3));  //0b111=15
printf("%d\n",a&(~(1<<2)));  //0b0011=3

以上输出结果为:

15

3

其他运算符

三目运算符(条件运算符)

三目运算的表达式:

表达式1?表达式2:表达式3

执行逻辑:先求解表达式1,如果其值为真(非0)则执行表达式2作为整个表达式的结果,否则(也就是表达式1的值为假)执行表达式3作为整个表达式的结果。

例如:

#include <stdio.h>
#include <stdlib.h>

int main(int args,char const *argv[])
{
    int a=5,b=6,max=0;
    max=a>b?a:b;
    printf("max=%d\n",max);
    return 0;
}

以上输出结果为:max=6

int num1=10,num2=20;
int res=num1>num2?num1++:num2++;
printf("num1=%d num2=%d rea=%d\n",num1,num2,res);

以上输出结果为:10 21 20

 运算符优先级

口诀:

单算移关与,异或逻条赋

从右向左单条赋

设int b=2;表达式(b>>2)/(b>>1)的值是(0

        解析:b>>2=0 b>>1=1 ==> 0/1=0

整型变量x和y的值相等,且为非零值,则下列表达式中结果为0的是(D

A. x || y        B.x | y        C.x & y        D.x ^ y

 

以下程序的输出结果是(100

int main()
{
    char x=040;
    printf("%o\n",x<<1);
    return 0;
}

        解析:将x转换为二进制在左移一位后转换为八进制

                 040=0b 0100 0000

                 左移一位后:0b 1000 0000

                 转换为八进制为:0100  

 

以下程序的运行结果为(11 22

int main()
{
    unsigned char a,b,c;
    a=0x3;
    b=a | 0x8;
    c=b<<1;
    printf("%d %d\n",b,c);
    retrn 0;
}

        解析:a=0b 0000 0011

                   b=0b 0011 | 0b 1000 = 0b1011 = 11

                   c=0b 1011 << 1 = 0b 0001 0110=22

 

设char型数据变量x中的值为1010 0111,则表达式(2+x)^(~3)的值为(0101 0101

        解析:2+x=0b 0000 0010 + 0b 1010 0111=0b 1010 1001

                   ~3=0b 1111 11100

                   0b 1010 1001 ^ 0b 1111 11100 = 0b 0101 0101

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【 文本到上下文 #4】NLP 与 ML

一、说明 欢迎回到我们的 NLP 博客系列&#xff01;当我们进入第四部分时&#xff0c;焦点转移到机器学习 &#xff08;ML&#xff09; 和自然语言处理 &#xff08;NLP&#xff09; 之间的动态相互作用上。在本章中&#xff0c;我们将深入探讨 ML 和 NLP 的迷人协同作用&#…

PLSQL 把多个字段转为json格式

PLSQL 把多个字段转为json格式 sql Select cc.bm, cc.xm, json_arrayagg(cc.hb) jgFrom (Select aa.bm, aa.xm, json_object(aa.ksbh, aa.wjmc) hbFrom (Select 001 bm, 老六 xm, 0001 ksbh, 文具盒 wjmcFrom dual tUnion AllSelect 001 bm, 老六 xm, 0002 ksbh, 毛笔 wjmcFr…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Modbus协议学习第三篇之协议通信规则

导语 本篇博客将深入介绍Modbus协议的一些内容&#xff0c;主要包括通讯方式和通讯模型的介绍 Modbus通讯方式 Modbus协议是单主机、多从机的通信协议&#xff0c;即同一时间&#xff0c;总线上只能有一个主设备&#xff0c;但可以有一个或者多个从设备&#xff08;最多好像是2…

基于springboot+vue的校园管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

贵阳贵安推进“数字活市”战略成效明显

作者&#xff1a;黄玉叶 近年来&#xff0c;贵阳贵安将数字经济确立为高质量发展的主路径之一&#xff0c;把推进“数字活市”作为实施主战略、实现主定位&#xff0c;特别是建设“数字经济发展创新区核心区”的重要抓手&#xff0c;从改革、发展、民生三个维度纵深推进“数字活…

未来的NAS:连接您的数字生活

未来的NAS&#xff1a;连接您的数字生活 引言 网络附加存储&#xff08;Network Attached Storage&#xff0c;简称NAS&#xff09;是一种通过网络连接的存储设备&#xff0c;用于集中存储和共享数据。传统的NAS设备通常包含一个或多个硬盘驱动器&#xff0c;可以通过局域网连…

数据结构和算法的部分例题(力扣)

1.数组 1.1 合并一个数组的两个有序区间 public class MargTwo {public static void main(String[] args) {int[] arr1{1,5,6,2,4,10,11};int[] arr2new int[arr1.length];marg2(arr1,0,2,3,6,arr2);}private static void marg2(int[]arr1,int iStar,int iEnd,int jStar,int j…

【机组】通用寄存器单元实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

广和通AI解决方案“智”赋室外机器人迈向新天地!

大模型趋势下&#xff0c;行业机器人将具备更完善的交互与自主能力&#xff0c;逐步迈向AI 2.0时代&#xff0c;成为人工智能技术全面爆发的重要基础。随着行业智能化&#xff0c;更多机器人应用将从“室内”走向“室外”&#xff0c;承担更多高风险、高智能工作。复杂的室外环…

阿里云国外服务器价格表

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

Linux网络引导自动安装centos7

目录 一、部署PXE远程安装服务 1. 系统装机的三种引导方式 2. pxe概述 3. 实现过程 4. 搭建过程中服务介绍 4.1 TFTP服务 4.2 vsftp&#xff1a;安装系统镜像文件获取方式 4.3 syslinux 4.4 DHCP服务 5. 操作过程 二、实现Kickstart无人值守安装 1. 安装Kickstart图…

Codeforce s Round 920 (Div. 3) G题 旋转矩阵,斜缀和,平移

Problem - G - Codeforces 目录 题意&#xff1a; 思路&#xff1a; 总思路&#xff1a; 旋转矩阵&#xff1a; 前缀和预处理&#xff1a; 平移的处理&#xff0c;尤其是越界的处理&#xff1a; 核心代码&#xff1a; 题意&#xff1a; 给你个n*m的矩阵&#xff0c;里…

【论文解读】用于代码处理的语言模型综述

目录 1.简要介绍 2.代码处理的语言模型的评估 3.通用语言模型 4.用于代码处理的特定语言模型 5.语言模型的代码特性 6.软件开发中的LLM 7.结论与挑战 ​​​​​​​1.简要介绍 在这项工作中&#xff0c;论文系统地回顾了在代码处理方面的最新进展&#xff0c;包括50个模…

Elasticsearch各种高级文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作

【MySQL】权限控制

DCL-权限控制 查询权限 show grants for 用户名主机名;授予权限 grant 权限列表 on 数据库名.表名 to 用户名主机名;grant all on test.* to user%; %是通配符&#xff0c;表示任意主机。撤销权限 revoke 权限列表 on 数据库名.表名 from 用户名主机名;revoke all on test.*…

10- OpenCV:基本阈值操作(Threshold)

目录 1、图像阈值 2、阈值类型 3、代码演示 1、图像阈值 &#xff08;1&#xff09;图像阈值&#xff08;threshold&#xff09;含义&#xff1a;是将图像中的像素值划分为不同类别的一种处理方法。通过设定一个特定的阈值&#xff0c;将像素值与阈值进行比较&#xff0c;根…

【代码随想录07】344.反转字符串 541. 反转字符串II 05.替换空格 151.翻转字符串里的单词 55. 右旋转字符串

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 05. 替换数字题目描述参考代码 151. 反转字符串中的单词题目描述参考代码 55. 右旋转字符串题目描述参考代码 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反…

指向未来: 量子纠缠的本质是一个指针

指向未来: 量子纠缠的本质是一个指针 概述基本概念理解量子纠缠PythonJavaC 理解波粒二象性PythonJavaC 理解量子隧穿理解宇宙常量PythonJavaC 概述 量子纠缠 (Quantum Entanglement) 是量子系统重两个或多个粒子间的一种特殊连接, 这种连接使得即使相隔很远, 这些粒子的状态也…

Git怎么将文件夹上传至github,全过程

小白建议参考github文件上传全流程-新手入门系列&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 中间可能会有报错 $ ssh -T gitgithub.com ssh: connect to host github.com port 22: Connection timed out 这时&#xff0c;参考&#xff0c;如何解决&a…
最新文章