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

news/2024/10/21 14:21:16/

所谓表达式就是指由运算符、运算量和标点符号组成的有效序列,其目的是说明一个计算过程。表达式可以独立成语句:表达式;

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

1. 算术运算符:+ - * / % ++ –

(1)/:整数相除,向下取整。

int a=3/2;
float b=3/2;
float c=3.0/2;
float n1=3,n2=2;
printf("%d\n",a);//1
printf("%f\n",b);//1.000000
printf("%f\n",c);//1.50000
printf("%f\n",n1/n2);//1.50000

只针对于常量相除,不针对于变量相除。

(2)%:只能用于整数运算,取余

10%3=1
12%10=2
123%10=3

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

#include <stdio.h>
int main(int argc, char const *argv[])
{int n=12345,g=0,s=0,b=0,q=0,w=0;g=n%10;s=n/10%10;b=n/100%10;q=n/1000%10;w=n/10000;printf("%d %d %d %d %d \n",w,q,b,s,g);return 0;
}

(3)++:自增

int a=0;

a++;或者++a;

相当于a=a+1;

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

(4)–:自减

a--;
--a;
a=a-1;
#include 
int main(int argc, char const *argv[])
{int a=1,b=1;a--;//a=a-1--b;//b=b-1printf("%d %d\n",a,b);//0 0return 0;
}

自加自减和打印结合🚨:++在前先++再打印,++在后先打印在++。

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

2. 赋值运算:= += -+ *= /= %=

int a=1,b=0;

(1)b=a++; //先赋值,再自加

先当于:b=a;a++;

(2)b=++a; //先自加,再赋值。

相当于:a++;b=a;

    int a=1,b=0;//b=++a;//结果会得2b=a++;printf("%d",b);//结果得1

例如:z=++x+y++;

相当于:x=x+1;z=x+y;y=y+1;

(3)a+=2;

相当于:a=a+2;

练习:

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

练习:

#include 
int main(int argc, char *argv[])
{int a = 10;int b = ++a;  //b=11 a=11     int c = a + (b++); //a=11 b=12 c=22int d = b + c;    //d=12+22=34printf("%d\n", d);return 0;
}
运算符名称示例功能缩写
<小于aa小于b时返回真,否则返回假。LT
<=小于等于a<=ba小于等于b时返回真,否则返回假。LE
>大于a>ba大于b时返回真,否则返回假。GT
>=大于等于a>=ba大于等于b时返回真,否则返回假。GE
==等于a==ba等于b时返回真,否则返回假。EQ
!=不等于a!=ba不等于b时返回真,否则返回假。NE

例子:

#include 
int main()
{int a=2,b=3;printf("%d\n",a>b);printf("%d\n",100%10!=0);return 0;
}

3.逻辑运算符:&& || !

3.1 &&(逻辑与)

全真则真,一假则假。

全都是真的才是真,只要有假就是假。

3.2 ||(逻辑或)

一真则真,全假则假。

只要有真就是真,全都是假才是假。

3.3 !(逻辑非)

非真为假,非假为真。

例子:

#include 
int main()
{int a=2,b=3;printf("%d\n",a>b); //0printf("%d\n",100%10!=0); //0printf("%d\n",(a<0)||(a>3));//0printf("%d\n",!(a>b));//1return 0;
}

3.4 截断法则🚨

逻辑或||运算中:如果前面表达式为真,则后面的表达式不执行。

逻辑与&&运算中:如果前面表达式为假,则后面的表达式不执行。

练习:

#include 
int main()
{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",m,n,r);//1 2 1
}
#include 
int main()
{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",m,n,r);//0 2 0
}

4 .位运算符:& | ~ ^ << >>

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

负数都是用反码进行运算的

4.1 位与 &

全1则1,有0则0.

例如:

​		1111 0101​	&	1010 1111​		1010 0101

4.2 位或 |

有1则1,全0为0。

例如:

​	1111 0101|	0101 0011​	1111 0111

4.3 异或^

不同为1,相同为0。

例如:

​ 1111 0101

^ 1111 1101

​ 0000 1000

4.4 取反 ~

按位取反,0变成1,1变成0。

​		原码	  反码				      补码正数:   本身	本身						本身负数:   本身	除了符号位不变其他位按位取反	反码+1
~15正数15:0000 1111~15:11110000

~-1:

原码:		  1000 0001反码:		  1111 1110补码=反码+1: 1111 1111~(-1):0000 0000

~ -5:

原码:1000 0101反码:1111 1010补码:1111 1011~(-5):0000 0100

4.5 << 左移

左移几位,右边补几个零。

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

-5<<3:

原码:1000 0101反码:1111 1010补码:1111 1011<<3:  1101 1000​	  1101 0111​	1010 1000 = -40

负数补码求原码:先减一,再符号位不变然后按位取反。

4.6 >> 右移

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

8>>2 :

0000 1000>>2 :0000 0010=2

4.7 置一公式和置零公式

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

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

例子:

#include 
int main()
{int a=0b0111;printf("%d\n",a|(1<<3));//15printf("%d\n",a&(~(1<<2)));//3return 0;
}

5. 特殊运算符

5.1 三目运算符

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

先求解表达式1,若其值为真则执行表达式2,表达式2的返回值作为整体的取值。否则将表达式3的值作为整体的取值。

#include 
int main()
{int a=10,b=6,max=0;max=(a>b)?a:b;printf("%d\n",max);  return 0;
}

练习:判断以下打印结果

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

5.2 sizeof( )**

用来计算数据所占空间大小的运算符。

格式:sizeof(数据类型或者变量名);

#include 
int main()
{int a = 10;double d=1.5;char c='a';printf("%d\n", sizeof(int));//4printf("%d\n", sizeof(a));//4printf("%d\n", sizeof(d));//8printf("%d\n", sizeof(c));//1return 0;
}

6 .优先级

p96giVJ.png

口诀📢: 单算移关与,异或逻条赋,从右向左单条赋

小练习1:实现大小写字母转换

#include 
int main(int argc, char const *argv[])
{char ch = getchar();if (ch >= 'A' && ch <= 'Z')ch += 32;else if (ch >= 'a' && ch <= 'z')ch -= 32;else printf("input error:\n");putchar(ch);putchar(10);return 0;
}

小练习2:结合宏定义和三目运算符实现求两个数的差

#include 
/*方式1.三目运算符结合宏 */
#define M 30
#define N 50
#define DIFF M>N?M-N:N-M
/*方式2.三目运算符结合宏函数 */         
#define DIFF_FUN(A,B) A>B?A-B:B-Aint main(int argc, char const *argv[])
{printf("%d\n",DIFF);        printf("%d\n",DIFF_FUN(7,1));//调用宏函数
}

小练习3:给出一个年份,判断是平年还是闰年。如果是润年打印1,平年打印0。

(思路:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)

思路,可以设置一个标志flag来接收平年还是闰年。然后用逻辑运算去判断平年还是闰年。最后打印flag。

#include
int main(int argc, char const *argv[])
{int year=0,leap=1;scanf("%d",&year);leap=(year%4==0 && year%100!=0 || year%400==0);printf("闰年为1,平年为0:%d\n",leap);return 0;
}

t *argv[])
{
printf(“%d\n”,DIFF);
printf(“%d\n”,DIFF_FUN(7,1));//调用宏函数
}

小练习3:给出一个年份,判断是平年还是闰年。如果是润年打印1,平年打印0。*(思路:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)*思路,可以设置一个标志flag来接收平年还是闰年。然后用逻辑运算去判断平年还是闰年。最后打印flag。```c
#include
int main(int argc, char const *argv[])
{int year=0,leap=1;scanf("%d",&year);leap=(year%4==0 && year%100!=0 || year%400==0);printf("闰年为1,平年为0:%d\n",leap);return 0;
}

img


http://www.ppmy.cn/news/66088.html

相关文章

Html技术

软件架构&#xff1a; 架构访问端服务端C/SClientServerB/SBrowserServer Html&#xff1a; Hyper Text Markup Language &#xff08;超文本标记语言&#xff09; 简写&#xff1a;HTML HTML 通过标签来标记要显示的网页中的各个部分。 网页文件本身是一种文本文件&#xff0…

camunda执行监听器和任务监听器有什么区别

Camunda的执行监听器和任务监听器是用于添加自定义逻辑的监听器&#xff0c;它们的区别在于作用对象和触发事件的不同。 执行监听器是与BPMN流程中的各种流程元素&#xff08;例如开始事件、用户任务、服务任务、网关等&#xff09;相关联的。执行监听器可以在流程元素执行前、…

Java中的JUnit是什么?如何使用JUnit进行单元测试

JUnit是Java中最流行的单元测试框架之一。它可以帮助开发人员在代码编写过程中检测出错误和异常&#xff0c;从而提高代码的质量和可靠性。 什么是JUnit&#xff1f; JUnit是一个由Kent Beck和Erich Gamma创建的开源Java单元测试框架&#xff0c;它已经成为Java开发中最常用的…

[MYSQL / Mariadb]数据库学习-库、表管理

数据库基础的库、表管理 数据库基础库管理MySQL中加上system&#xff0c;可以执行Linux命令一行写多个命令 表管理建表 例&#xff1a;查表架构创建表记录查表的创建命令和属性加\G&#xff0c;可分行显示修改表记录&#xff1a;删除表记录&#xff1a;下面是自定义练习 改表的…

十三、共享内存

文章目录 一、什么是共享内存&#xff08;一&#xff09;共享内存的定义&#xff08;二&#xff09;共享内存的原理&#xff08;三&#xff09;共享内存的理解 二、为什么要有共享内存三、共享内存怎么进行&#xff08;一&#xff09; 共享内存的数据结构&#xff08;二&#x…

『python爬虫』16. 多线程与多进程(保姆级图文)

目录 多线程1. 什么是多线程&#xff1f;2. 串行模式3. 多线程3.1 多线程方法写法3.2 多线程方法带参数3.3 多线程类写法 多进程1. 什么是多进程 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 多线程 1. 什么是多…

2023年电梯行业研究报告

第一章 行业概况 电梯行业是指制造、销售、安装、维护和升级电梯及相关设备的产业。电梯行业是一个不断发展的行业&#xff0c;主要因为人们对更高层建筑的需求越来越大&#xff0c;以及城市化进程的加速&#xff0c;从而需要更多的垂直交通设施。电梯行业在世界各地都有很好的…

干货 | ChatGPT使用指南,让你轻松上车AI世界!

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 聊天机器人&#xff08;Chatbot&#xff09;是一种人工智能应用&#xff0c;可以模拟人类对话行为&#xff0c;以自然语言进行交互。 在过去的几年里&#xff0c;随着自然语言处理技术和深…