C语言操作符
C语言操作符的分类:
算术操作符 逻辑运算符 位操作符 赋值操作符
单目操作符 关系操作符 条件操作符
逗号表达式 数组下标引用 函数调用 结构体成员使用
大体上,C语言的操作符具体就这么些,俗话说的好,饭得一口一口吃,知识也得一点一点学习;
首先让我们来了解一下这些操作符的使用规则和注意事项(坑踩的多了自然就平了,错误出的多了自然就开始怀疑人生了(.//囍\\))
1.算术操作符
算术和算数有什么区别呢?
本质区别在于:算术是数学的一个分支,是数学的最初形式,而算数是动词,没有直接关系;如果把算术混淆为算数的话,可是给我们理工科的
闹了个大笑话了..
进入正题,算术操作符有哪些: + - * / % ++ --
加法运算符(+):是用来进行加法运算的,使其两侧的值相加;
减法运算符(-):是用来进行减法运算的,使其两侧的值相减;
乘法运算符(*):是用来进行乘法运算的,使其两侧的值相乘;
除法运算符(/):是用来进行除法运算的,左侧的值是被除数,右侧的值是除数.
求模运算符(%):只能用于整数运算不能用于浮点型,求模运算符给出其左侧整数除以右侧整数的余数;
递增运算符(++):对运算对象进行+1操作;
递减运算符( -- ):对运算对象进行-1操作;
//算术运算符
void Test_1() {
int a = 20;
int b = 10;
//加法运算
printf("a + b = %d\n",a + b);
//减法运算
printf("a - b = %d\n",a - b);
//乘法运算
printf("a * b = %d\n",a * b);
//除法运算
printf("a / b = %d\n",a / b);
//求模运算
printf("a %% b = %d\n",a % b);
}
算术运算符使用注意事项和说明 :
让我们先了解一下除法的运算规则: 被除数 / 除数 = 商 ......余数 *** 除数不能为0,否则无意义.
1-两个实数的除法运算结果为一个双精度浮点数,两个整数的除法运算结果为一个整形数;如果输入
( 5 / 3 ) 结果 1;舍去小数部分.
2-%求模运算符的操作数只能为整数,其他的操作数可以是任何的算术类型;
(打印求模运算符%时,需要双%%来表示).
3-关于++和--我会在后面的单目操作符进行解释说明;
2.逻辑运算符
在C语言中,逻辑判断区分真假只有0和非0;
非零的数字能够转换成真,也就是数字1;假就是0;
1>分类: && || !
逻辑与 ( && ) :
例如 a && b ; 如果 a 和 b 都为真,那么结果为真 ,否则为假;
逻辑或( || ) :
例如 a || b ; 如果a 和 b 都为假,那么结果就为假,否则为真;
逻辑非( ! ) :
例如 !a ; 如果a为真,那么结果为假,反之,如果a为假,结果为真;
如果你不熟悉运算符或者觉得很别扭,请记住 : (练习 && 时间) == 完美;
2>运算符说明:
逻辑与( && )和逻辑或( || )都是双目运算符,要求使用它有两个运算对象;
逻辑非( ! ) 是单目运算符,要求使用它有一个运算对象;
求值顺序 :逻辑表达式的求值顺序是从左往右,一旦发现有使整个表达式为假的因素,就会立即停止求值;
3.位操作符
分类: & | ^ ~ >> <<
按位与 ( & ) : 通常用于二进制的取位操作,
例如一个数 and 1的结果就是取二进制的最末位,这样可以进行判断一个整数的奇偶,
二进制的最末位为0,表示该数位偶数,最末位为1则为奇数;
按位或 ( | ) : 通常用于二进制特定位上的无条件赋值,
例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数按位或( | ) 1之后再减一就可以了,
其实际意义就是把这个数强行变成最接近的偶数。
按位异或 ( ^ ) : 按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
按位取反( ~ ) : 就是把所有的二进制位,只要是1就变成0,0变成1;
左移运算符( << ) : a << b,表示对a的二进制数左移b位;
移位规则: 左边抛弃,右边补0;
右移运算符( >> ) :
右移运算分为两种: 1>逻辑移位 : 左边用0填充,右边抛弃;
2>算术移位 : 左边用原该值的符号位填充,右边抛弃;
4.赋值运算符
分类 : = += *= /= %= >>= <<= &= |= ^=
赋值运算符是把右侧表达式的值赋给左侧的变量.它们都用于更新变量,其用法都是
左侧一个变量名,右侧一个表达式.赋给变量的值是由右侧表达式的值调整后的值.
#include<stdio.h>
int main() {
// 以 += 为例,说明复合复制运算符的表达含义
// 同义理解 -=, *=,/=,%= 等赋值运算符
int x = ;
int y = ;
x += y; // x = x + y
return ;
}
注意 和 说明 :
1-注意'='和"=="的区别,很多人都在这里过问题.(重要的事情说很多遍);
2-赋值运算符的优先级比算术运算符的优先级低;
2-复制运算符是把右侧表达式的值赋给左侧的变量.它们都用于更新变量,其用法都是
左侧一个变量名,右侧一个表达式,赋给变量的值是由右侧表达式的值调整之后的值决定.
4.虽然这些运算符可以由几行简单的代码表示,并且运行效果一样,但是使用赋值运算符
可以让代码看起来更紧凑,而且与一般代码相比,赋值运算符可以使生成的机器代码更高效
5.在使用for循环加入一些复杂的表达式时,复制运算符就很好用.
5.单目操作符
! 逻辑取反操作
- 负值
+ 正值
& 取地址
sizeof 操作符的类型长度(以字节为单位)
(类型) 强制转换
++ 前置++; 后置++
-- 前置--; 后置--
1>+和-可以表示算术运算,也可以表示数字的符号,
2>&取地址,在C语言中,创建变量时,系统内存会自动给变量分配一段存储空间,我们不能直接
访问这些变量,因为我们不知道他们的存储地址,需要使用&来找到变量的房间号,进而访问
所需要访问的变量;
3>sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);
在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符.
4> (类型)强制转换 : 1-(类型说明符)表达式***其功能是将表达式的运算结果强制转换为括号内的
类型说明符的类型;
2-不管是强制转换还是自动转换都是为了本次运算的需要而进行临时的转换;
不改变数据说明时对该变量定义的类型
void Test() {
int m = 1;
//m++
printf("%d\n",m++);
//重置m的值为1
m = 1;
//++m
printf("%d\n",++m);
}
自增运算符和自减运算符的前置后置区别:
后置++i : 在使用 i 之前先使 i 的值+1;
前置i++ : 在使用 i 之后再使 i 的值+1;
自减运算符同理.
6.关系运算符
分类 : > >= < <= == !=
说明 :
1-老生常谈:"=="和'='的区别,看起来啰嗦了一点,但是还是得说明一下;
2-对于一些复杂的关系表达式:b < a < c
不能直接表示,需要使用逻辑运算符: a > b && a < c;
为什么?未定义行为,C语言不支持.
7.条件运算符
//使用if-else判断两个数的较大值
if(a > b){
max = a;
}
else {
max = b;
}
//使用条件运算符" ? :"判断两个数的较大值
max = (a > b) ? a : b;
上面的两段代码都可以求出两个数的较大值,很明显,使用条件运算符的代码更简洁;
条件运算符: ? :
说明 : 条件运算符需要三个操作对象,每个操作对象都是一个表达式,通用形式为:
exp1 ? exp2 : exp3;
如果exp1为真,那么整个表达式的值为exp2,否则为exp3;
如: (5 > 3) ? 1 : 2; 值为1;
(3 > 5) ? 1 : 2; 值为2;
(a > b) ? a : b; 如果a > b,则取较大的值.
8.逗号运算符
逗号运算符把两个表达式连接成一个表达式,并保证最左边的表达式最先求值.
逗号运算符通常在for循环头的表达式中用于包含更多的信息,整个逗号表达式的值
是逗号右侧表达式的值;
#include<stdio.h> int main(){
int i = 0;
i = 1, i = 10;
printf("i = %d\n",i);
return 0;
}
输出结果为:
i = 10
9.数组下标引用
[ ]变址运算符或者称为下标引用操作符
操作形式: 数组名 + [索引值]
int arr[4] = {4,3,9,6};//注意索引值不能越界
printf("arr[3] = %d\n",arr[3]);
//[ ]的两个操作数就是arr(数组名)和3(索引值)
10.函数调用操作符
接收一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数;
#include<stdio.h>
void Test(){
printf("Hello BKY!\n");
}
void Add(int x,int y){
printf("%d\n",x+y);
}
int main(){
//第一种是没有参数传递的,直接函数名+();
Test();
//第二中是传参的形式,函数名+(参数1,参数2);
Add(10,20);
return 0;
}
11.结构体成员使用
访问一个结构体的成员有两种形式:
1> 结构体.成员名;
2> 结构体指针->成员名;
#define SIZE 100
struct Stu{
char num[SIZE];
char name[SIZE];
};
struct Stu Stu;
//使用结构体变量名引用成员
void Print_1() {
strcpy(Stu.num, "001");
strcpy(Stu.name, "飘雪");
printf("Stu.num = %s\n",Stu.num);
printf("Stu.name = %s\n",Stu.name);
}
struct Stu *p;
//使用结构体指针引用成员
void Print_2() {
p = &s
strcpy(p->num, "002");
strcpy(p->name, "无情");
printf("p->num = %s\n",p->num);
printf("p->name = %s\n",p->name);
}
C语言操作符的更多相关文章
- C语言操作符优先级
C语言操作符优先级 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运 ...
- C语言操作符学习总结
c语言中关于操作符部分的学习,可以主要分为两个部分:操作符和表达式. 这里首先是列举各种操作符,在C语言中,一般主要的操作符有这么几种:算数操作符,移位操作符,位操作符,赋值操作符,单目运算符,关系操 ...
- C语言-操作符与表达式
C语言入门之操作符与表达式 前言 本篇文章主要包括各种操作符的介绍与表达式求值,欢迎各位小伙伴与我一起学习. 一.操作符 分类 算术操作符 移位操作符 位操作符 赋值操作符 单目运算符 关系操作符 逻 ...
- C语言操作符/表达式及其作用总结
一.算术操作符:+ - * / % 1. 除了 %操作符之外,其他的 几个操作符可以作 用于整数和浮点数. 2. 对于"/"操作符如果两个操作数都为整数,执行整数除法.而只要有浮点 ...
- c语言操作符总结
分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 其他操作符(下标引用.函数调用和结构成员) 一.算数操作符 1.算术操作符包括:+ ...
- 被C语言操作符优先级坑了
今天有一个枚举的题目的代码是这样的: 重点在于maxXor这个函数的实现,枚举两个数字,其中maxr保存了最大值的 i 异或 j , 可是这个程序执行结果大大出乎意外-_-. 然后就把 i 异或 j ...
- C++ 语言操作符的优先级
cppreference.com -> C++ 操作符优先级 C++ 操作符优先级 优先级 操作符 1 () [] -> . :: ! ~ ++ ...
- c语言操作符 “++”另类行为
正常情况下,我们使用++ int a = 1; a++; printf(“%d”,a); // 2; 很简单没什么好说的. #include <stdio.h> int main() ...
- 浅析C语言指针问题
首先明白c语言操作符的优先级及结合性就很容易理解了. 链接 1.关于char *s 及 char s[] char *s指向的是一个字符串对象的指针,可以理解为间接引用,比如 char *s = “1 ...
随机推荐
- Description Resource Path Location Type Java compiler level does not match the version of(编译问题)
project 编译问题,需要三处的jdk版本要保持一致,才能编译通过. 1.在项目上右键properties->project Facets->修改右侧的version 保持一致 2. ...
- IP通信基础学习第九周
H3C单臂路由: 交换机的所有接口是在同一个广播域 用vlan进行隔离广播域 创建vlan,display可查看是否创建成功 进入接口是Interface,配置接口Port 先测试相同的vlan ,可 ...
- postgres跨平台开发坑之空值
ngx_lua架构下查询linux版postgres时,如果目标字段的值返回空,则返回结果为 ngx.null,同样的代码如果查询windows版postgres时,如果目标字段的值返回空,则返回结果 ...
- windows版jmeter的body data如何用\n作为“换行”
前段时间用jmeter进行某个web接口性能测试的时候遇到一个问题,body data中的换行的内容发送后,通过抓包发现总是发送"0D0A"即"\r\n"(wi ...
- vue scrolle在tab 中使用
1. 使用npm 安装 npm i vue-scroller -S 地址: https://github.com/wangdahoo/vue-scroller2. 引入 main.js: import ...
- 0x14哈希之兔子兔子
参考链接:https://www.cnblogs.com/wyboooo/p/9813428.html 题目链接:https://www.acwing.com/problem/content/140/ ...
- 【Django基本命令002】
在mac或者window的终端直接输入这些命令(不是Python的shell中) 一.创建Django项目之前必须先激活 具体方法可以参考Python机器语言学习博客 二.开始新建项目 1.新建一个d ...
- Oracle基础知识点——Oracle服务端和客户端
Oracle服务端 服务端提供oracle服务的实例,其是数据库的核心,用于数据库的管理,对象的管理与存储.数据的存储.查询.数据库资源的监控.监听等一些服务. 例子:比如一台机子上安装了Oracle ...
- Jenkins学习
1.jenkins启动卡在密码初始化处不动的情况,参照: https://blog.csdn.net/lylload/article/details/82754101 https://blog.csd ...
- 使用TLS证书保护Docker
使用TLS证书保护Docker 当我们使用远程调用docker时,未设置TLS的docker,将可以被任何人调用,这是极其危险的. 在阿里云上跑的docker,这次就被不怀好意的人扫描到了默认端口,2 ...