各种运算符的介绍,超详解

简介: 各种运算符的介绍,超详解

C语言提供了以下运算符:

(1)算术运算符    (+  -  *  /  %  ++  -- )  

(2)关系运算符   (>  <  ==  >=  <=  ! =)  

(3)逻辑运算符  ( !&&  ||  )                      

(4)位运算符        (<< >> ~ | ^ &)              

(5)赋值运算符     (=及其扩展赋值运算符)

(6)条件运算符    (?:)                        

(7)逗号运算符     ( , )                              

(8)指针运算符    ( * 和 & )                        

(9)求字节数运算符  ( size of )            

(10)强制类型转换运算符   (  (类型))  

(11)成员运算符    ( .  ->)                    

(12)下标运算符        ( [ ] )                      

(13)其他           (函数调用运算符等)      

 接下来,会和大家一一介绍。

1.算术运算符

基本算术运算符(+ - * / %)

先讲讲最基本的算术操作符

运算符 含义 举例 结果
+ 正号(单目运算符) +a a的值
- 负号(单目运算符) -a a的算术负值
* 乘法运算符号 a*b a和b的乘积
/ 除法运算符 a/b a除以b的商
% 求余运算符 a%b a除以b的余数
+ 加法运算符 a+b a和b的和
- 减法运算符 a-b a和b的差

#在C语言中,数学中的 乘号‘x’我们用 ‘*’代替。(ctrl +8)

#在C语言中,数学中的 除号‘➗’我们用 ‘/ ‘代替。  

int main ()
{    
    int a = 7;
    int b = 3;
    int c = a%b;
    return 0;
}

%运算符要求参加运算的运算对象(即操作数)为整数,结果也是整数。                

int main()
{
    int a = 7;
    int b = 3;
    int c = a/b;
    return 0;
}

结果:c = 2        两个整数相除的结果为整数,当两个实数相除时结果为双精度实数。

int main()
{
    double a = 7;
    double b = 3.0;
    double c = a/b;
    return 0;
}

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

前置++

int main()
{
    int a = 1;
    int b = ++a;
    return 0;
}

当使用前置++时,为先++,后使用。先给a+1,然后在赋值给b。

结果:a=2,b=2

后置++

int main()
{
    int a = 1;
    int b = a++;
    return 0;
}

当使用后置++时,先使用,后加加。a的值会先赋值给b,然后a再加1。

结果:a=2,b=1

前置--

int main()
{
    int a = 1;
    int b = --a;
    return 0;
}

当使用前置--时,为先--,后使用。先给a-1,然后在赋值给b。

结果:a=0,b=0

后置--

int main()
{
    int a = 1;
    int b = a--;
    return 0;
}

当使用后置--时,先使用,后加加。a的值会先赋值给b,然后a再减1。

结果:a=0,b=1

2.关系运算符(> < == >= <= !=)

> 大于号

< 小于号

== 用来判断两个值大小是否相同(=为赋值符,给一个数赋值)

>= 大于等于

<= 小于等于

!= ’!‘为反逻辑,意思为不等于。

关系运算符一般用来比较大小。

#include <stdio.h>
int main()
{
    int a = 1;
    int b = 0; 
    if(a>b)
        printf("%d\n",a);
    return 0;
}

结果:1

#include <stdio.h>
int main()
{
    int a = 3;
    if(a!=0)
        printf("haha\n");
    return 0;
}

结果:haha

3.逻辑运算符 ( !&&  ||  )

运算符 含义 举例 说明
&& 逻辑与(and) a&&b 如果a和b都为真,则结果为真,否则为假
||

逻辑或(or)

a || b 如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假
逻辑非(not) !a 如果a为假,则!a为真,如果a为真,则!a为假

#在C语言中,0表示为假,非零表示为真。

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    if(a&&b)
        printf("haha");
    return 0;
}

以上图为例

&&        只有左右两边的为真,结果才为真。一旦有一边为假,那么结果就为假。

a=1,b=2,a&&b 结果为真。

a=1,b=0,   a&&b 结果为假。

a=0,b=2,   a&&b 结果为假。

a=0,b=0,   a&&b 结果为假。


||        只有两边同时为假,结果才为假。一旦有一边为真,那么结果就为真。

a=1,b=2,a || b 结果为真。

a=1,b=0,a || b 结果为真。

a=0,b=2,a || b 结果为真。

a=0,b=0,a || b 结果为假。


!        逻辑非,输出的结果将会与实际结果相反。

#include <stdio.h>
int main()
{
    int a = 0;
    if(!a)
        printf("haha\n");
    return 0;
}

结果:haha

因为a的结果是0,那么a的相反就是非0,因此If语句判断为真。

当a=3时,a的相反就为0。那么if语句判断为假。就没有办法打印。

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

 &按位或  ||按位与  ^按位异或

都是按照二进制来进行操作的。

& : 按位与 只要有0,那么就为0。

a&b,将a和b的二进制数字相应的位数进行比较,只要有0,那么就为0。

int a = 3;
int b = 5;
int c = a&b;
二进制数:
// 0 0 1 1  a
// 0 1 0 1  b
// 0 0 0 1  c

||   :按位或 只要有1,那么就为1。

a||b,将a和b的二进制数字相应的位数进行比较,只要有1,那么就为1。

int a = 3;
int b = 5;
int c = a||b;
二进制数:
// 0 0 1 1  a
// 0 1 0 1  b
// 0 1 1 1  c

^  :按位异或 相同为0,相异为1.

a^b,将a和b的二进制数字相应的位数进行比较,相同为0,相异为1。

int a = 3;
int b = 5;
int c = a^b;
二进制数:
// 0 0 1 1  a
// 0 1 0 1  b
// 0 1 1 0  c

~ 对一个数的二进制按位取反

~ :按位取反,1变成0,0变成1.

int b = 5;
二进制数字:
// 0 1 0 1
~b=10
// 1 0 1 0

<< 左移操作符 >> 右移操作符

<< : 将变量的二进制数字往左移动一位,左边的一位超过范畴舍去,右边缺少一位补0。

int a = 3;
二进制数字:
// 0 0 1 1
<<3 = 6
// 0 1 1 0

0 0 1 1 -> (0) 0 1 1 0

<< : 将变量的二进制数字往右移动一位,右边的一位超过范畴舍去,左边缺少一位补0。

int a = 3;
二进制数字:
// 0 0 1 1
>>3 = 1
// 0 0 0 1

0 0 1 1 ->  0 0 0 1 (1)

5.赋值运算符(=)

当你不喜欢某个值的时候就可以用等于号,来将这个值给变换。

#include<stdio.h>
int main()
{
  int weight = 200; //体重不喜欢,给自己赋一个喜欢的值
  weight = 100;
  int salary = 10000;//工资不喜欢,给自己赋一个喜欢的值
  salary = 20000;
  int hight = 160;/*身高不喜欢,给自己赋一个喜欢的值*/
  hight = 180;
  printf("weight=%d,salary=%d,hight=%d\n",weight,salary,hight);
  return 0;
}

结果:weight=100,salary=20000,hight=180

6.条件运算符(?:)

条件运算符又可以叫做三目运算符。因为它需要三个操作数。

表达式?表达式二:表达式三

表达式1表判断,如果表达式1为真的话。就会执行表达式2,如果表达式1为假的话,就会执行表达式3。

#include <stdio.h>
int main()
{
  int a = 4;
  int b = 5;
  a > b ? printf("%d\n", a) : printf("%d\n", b);
  return 0;
}

这里就是比大小,当a>b的时候就会执行表达式2,打印出a的值。如果a<b的话,那就会执行表达式3,打印b的值。

条件运算符适用于那些表达式比较简单的,如果表达式比较复杂的话,就要考虑使用if语句。

7.逗号表达式(,)

逗号表达式就是用逗号隔开的多个表达式。

从左到右依次计算。最后算出的结果是最后一个表达式的结果。

int main()
{
  int a = 4;
  int b = 5;
  int c = 6;
  b =( ++a, 6, ++c);
  return 0;
}

结果:a=5,b=7,c=7.

8.指针运算符(*和&)

* 又可以叫间接访问操作符(解引用操作符)

*常常与指针伴随使用。

int main()
{
    int a = 10;
    int* p = &a;
    *p = 20;
    printf("%d\n",a);
    return 0;
}

p被赋予a的地址,即p为指针,*p可以通过地址来使用a或者直接改变a的值。

&取地址操作符,可以取一个变量的地址。

int main()
{
    int a = 10;
    printf("%d\n",&a);
    return 0;
}

结果:0x010ffcc0

就是a的地址。

9.求字节数运算符(sizeof)

sizeof是用来计算变量所占内存的大小,或者是类型所创造的变量占据空间的大小。

int main()
{
  char arr[10] = { 0 };
  int tmp[10] = { 0 };
  printf("%d\n", sizeof arr);
  printf("%d\n", sizeof tmp);
  return 0;
}

int 整形的一个变量的大小为4个字节,而char 字符类型所产生的一个变量的所占内存大小为1个字节,因此

结果:10

          40

10.强制类型转换运算符(类型)

       可以利用强制类型转换运算符将一个表达符将一个表达式转换成所需类型。

int main()
{
  int a = 3.14;
  printf("%d\n", a);
  return 0;
}

这样的程序最后会报出警告,但是在msvc中依旧能打印结果'3'。

11.成员运算符(-> .)

ps->age=20;//为定义结构体成员。
ps.age//为使用结构体成员

 ->和. 是成员运算符,两者的不同点在于一个用来使用,一个用来定义,

ps->age=20;

=(*ps).age=20;

12.下标运算符([ ])

int arr[10] = {0,1,2,3,4,5,6,7,8,9};
//arr[7] = {7};

其中的[]就是下标引用操作符,而arr和7就是操作数,我们在调用数组时,可以:

printf("%d\n",7[arr] );

这样的写法也是对的,但是不符合我们的习惯。

 但是在定义的时候我们不能使用:

int 10[arr]={0};

这样的写法是错的。        

13.其他(函数调用操作符)

int c = Add(a,b);

 这里的()就是函数引用操作符,而Add,a,b就是操作数。

目录
相关文章
|
编解码
一文详解 URLEncode
使用浏览器进行Http网络请求时,若请求query中包含中文,中文会被编码为 `%+16进制+16进制`形式,但你真的深入了解过,为什么要进行这种转义编码吗?编码的原理又是什么?
1092 0
一文详解 URLEncode
|
7月前
|
Linux Shell
问题记录:解决Linux登录故障,/etc/passwd配置受损该怎么操作
修复/etc/passwd文件是解决Linux登录故障的重要步骤。通过进入单用户模式、挂载文件系统、恢复或手动修复/etc/passwd文件,可以有效解决该问题。保持定期备份系统配置文件是预防此类问题的最佳实践。
233 5
|
11月前
|
存储 关系型数据库 MySQL
MySQL 索引结构及其优劣
【10月更文挑战第12天】不同的索引结构各有其适用场景,在实际应用中,需要根据数据特点、查询需求等因素综合考虑选择合适的索引结构。同时,过多或不合理的索引也可能会带来一些负面影响,如增加存储开销、降低数据插入和更新的速度等。因此,在设计索引时需要进行合理的规划和优化。
269 57
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
262 6
|
关系型数据库 MySQL
MySQL 保姆级教程(七):用正则表达式进行搜索
MySQL 保姆级教程(七):用正则表达式进行搜索
|
消息中间件 SQL 数据可视化
最接地气的.NET微服务框架 - Wing
最接地气的.NET微服务框架 - Wing
376 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的工作流程管理系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的工作流程管理系统的详细设计和实现
184 1
|
存储 XML 数据处理
Python网络实践:去哪儿旅游数据爬取指南
Python网络实践:去哪儿旅游数据爬取指南
378 1
|
人工智能 运维 监控
在日常开发工作中,日志数据该如何利用?
在日常开发工作中,日志数据是一个宝贵的资源,它可以提供关于应用程序运行状态、错误报告、性能指标和用户行为等方面的重要信息。正确地利用和分析日志数据可以帮助开发人员更好地理解应用程序的运行情况,快速定位和解决问题,改进应用程序的性能,并为业务决策提供有力支持。尤其是在现代科技发展的背景下,日志数据作为一种重要的信息资源,对于运维工作具有极大的价值。然而,如何充分利用日志数据,并将其应用于运维和开发工作中,仍然是许多企业和运维和开发人员关注的问题。那么本文就来分享一下在日常开发中关于日志数据的利用方面的探讨。
479 1
在日常开发工作中,日志数据该如何利用?
|
传感器 自动驾驶 算法
Apollo感知模块 :传感器| 目标监测| 障碍物识别 | 模型管理
Apollo感知模块 :传感器| 目标监测| 障碍物识别 | 模型管理
263 0