C语言全面细致精讲操作符的使用

目录
  • 前言
  • 一、算术操作符
  • 二、移位操作符
    • 1.左移操作符
    • 2.右移操作符
  • 三、位操作符
  • 四、 赋值操作符
    • 复合赋值符
  • 五、单目操作符
    • 单目操作符介绍
      • 1.sizeof 和 数组
      • 2.++和–运算符
  • 六、关系操作符
  • 七、逻辑操作符
  • 八、条件操作符
  • 九、逗号表达式
  • 十、下标引用与函数调用和结构成员
    • 1. []下标引用操作符
    • 2. ()函数调用操作符
    • 3. 访问一个结构的成员

前言

本次文章我们要讲各种操作符的介绍,内容非常详细,大家拭目以待哦!

首先介绍操作符的种类

操作符分类:

  1. 算术操作符
  2. 移位操作符
  3. 位操作符
  4. 赋值操作符
  5. 单目操作符
  6. 关系操作符
  7. 逻辑操作符
  8. 条件操作符
  9. 逗号表达式
  10. 下标引用、函数调用和结构成员

一、算术操作符

+    -   *   /   %

  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

二、移位操作符

<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。

1.左移操作符

移位规则:左边抛弃、右边补0

//10 下面是在二进制中那个的表示形式
//0000000000000000000000000000000000001010
//左移一位
//0000000000000000000000000000000000010100

2.右移操作符

移位规则:

首先右移运算分两种:

1.逻辑移位

左边用0填充,右边丢弃

2.算术移位

左边用原该值的符号位填充,右边丢弃

//我们假设用-1来举例子
//-1在二进制中表示为32个1
//11111111111111111111111111111111
//逻辑右移
//01111111111111111111111111111111
//算术右移
//11111111111111111111111111111111

警告 :

对于移位运算符,不要移动负数位,这个是标准未定义的。

例如:

int num = 10;
num>>-1;//error

三、位操作符

位操作符有:

& //按位与

| //按位或

^ //按位异或

注:他们的操作数必须是整数。

练习一下:

int main() {
	//& 按(2进制)位与
	//| 按(2进制)位或
	//^ 按(2进制)位异或
	int a = 3;
	int b = -5;
	int c = a & b;
	//00000000 00000000 00000000 00000011 3的补码
	//10000000 00000000 00000000 00000101 -5 原码
	//11111111 11111111 11111111 11111010  反码
	//11111111 11111111 11111111 11111011 补码
	//00000000 00000000 00000000 00000011 3的补码
	//00000000 00000000 00000000 00000011   //按位与 全1为1  其他位0
	printf("%d\n", c);
	int d = a | b;
	//11111111 11111111 11111111 11111011 补码
	//00000000 00000000 00000000 00000011 3的补码
	//11111111 11111111 11111111 11111011 补码
	//10000000 00000000 00000000 00000100
	//10000000 00000000 00000000 00000101
	printf("%d\n", d);
	int e = a ^ b;
	//11111111 11111111 11111111 11111011 补码
	//00000000 00000000 00000000 00000011 3的补码
	//11111111 11111111 11111111 11111000
	//10000000 00000000 00000000 00000111
	//10000000 00000000 00000000 00001000
	printf("%d\n", e);
	return 0;
}

一道变态的面试题:

不能创建临时变量(第三个变量),实现两个数的交换

int main() {
	int a = 3;
	int b = 5;
	//printf("交换前a=%d,b=%d\n",a,b);
	方法一
	//a = a + b;
	//b = a - b;
	//a = a - b;
	//printf("交换前a=%d,b=%d\n", a, b);
	printf("交换前a=%d,b=%d\n", a, b);
	//方法二
	a = a ^ b;//3^5
	b = a ^ b;//3^5^5=3
	a = a ^ b;//3^5^3=5
	printf("交换后a=%d,b=%d\n", a, b);
	return 0;
}

练习:

编写代码实现:求一个整数存储在内存中的二进制中1的个数。

int main() {
	int m = 15;
	int i = 0;
	int count = 0;
	while (i < 32)
	{
		if (((m >> i) & 1) == 1)
			count++;
		i++;
	}
	printf("count:%d\n",count);
	return 0;
}

分别用每一位与1

这一位是1运算后的结果就是1

四、 赋值操作符

赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值

int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20; a = x = y+1;//连续赋值
这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1; a = x;
这样的写法是不是更加清晰爽朗而且易于调试。

复合赋值符

+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

这些运算符都可以写成复合的效果。

比如:

int x = 10; x = x+10; x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。

五、单目操作符

单目操作符介绍

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符) (类型)       强制类型转换

演示代码:

#include <stdio.h>
int main()
{
	 int a = -10;
	 int *p = NULL;
	 printf("%d\n", !2);
	 printf("%d\n", !0);
	 a = -a;
	 p = &a;
	 printf("%d\n", sizeof(a));
	 printf("%d\n", sizeof(int));
	 printf("%d\n", sizeof a);//这样写行不行?
	 printf("%d\n", sizeof int);//这样写行不行?//结果是不行
	 //其实我们从这里就可以看出sizeof不是一个函数
	 return 0;
 }

关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。

1.sizeof 和 数组

#include <stdio.h>
void test1(int arr[])
{
	 printf("%d\n", sizeof(arr));//(2)//这里是指针,因为传过来的是地址要拿指针接收 在32为机器下 字节为4
}
void test2(char ch[])
{
	 printf("%d\n", sizeof(ch));//(4)//同理//这里是指针,因为传过来的是地址要拿指针接收 在32为机器下 字节为4
}
int main()
{
	 int arr[10] = {0};
	 char ch[10] = {0};
	 printf("%d\n", sizeof(arr));//(1)//40
	 printf("%d\n", sizeof(ch));//(3)//10
	 test1(arr);
	 test2(ch);
	 return 0;
 }

问:
(1)、(2)两个地方分别输出多少?
(3)、(4)两个地方分别输出多少?

2.++和–运算符

//前置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = ++a;
     //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
    int y = --a;
    //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
    return 0;
 }
//后置++和--
#include <stdio.h>
int main()
{
    int a = 10;
    int x = a++;
    //先对a先使用,再增加,这样x的值是10;之后a变成11;
    int y = a--;
    //先对a先使用,再自减,这样y的值是11;之后a变成10;
    return 0; }

六、关系操作符

关系操作符

>
>=
<
<=
!=   用于测试“不相等”
==      用于测试“相等”

这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。

警告:

在编程的过程中== 和=不小心写错,导致的错误。

七、逻辑操作符

逻辑操作符有哪些:

&& 逻辑与
|| 逻辑或

区分逻辑与和按位与

区分逻辑或和按位或

1&2----->0

1&&2---->1

1|2----->3

1||2---->1

接下来我们引入一道360的面试题

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0; }
//程序输出的结果是什么?

这里逻辑且运算碰到错误直接结束,后面的运算就不再继续

而逻辑或运算碰到正确直接结束,后面的运算就不再继续

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	return 0;
}
//程序输出的结果是什么?

八、条件操作符

exp1 ? exp2 : exp3

练习:

1.
if (a > 5)
        b = 3;
else
        b = -3;
转换成条件表达式,是什么样?
2.使用条件表达式实现找两个数中较大值
 return a>b?a:b;

九、逗号表达式

exp1, exp2, exp3, …expn

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

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

//代码1
	int a = 1;
	int b = 2;
	int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
//	c是多少?
//代码2
	if (a =b + 1, c=a / 2, d > 0)
//代码3
	a = get_val();
	count_val(a);
	while (a > 0) {
 //业务处理
        a = get_val();
        count_val(a);
	}
//如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0) {
         //业务处理
	}

提示

这里一定要计算前面的值,可能会对最后一个表达式进行影响

十、下标引用与函数调用和结构成员

1. []下标引用操作符

操作数:

一个数组名 + 一个索引值

int arr[10];//创建数组
 arr[9] = 10;//实用下标引用操作符。
// [ ]的两个操作数是arr和9。
//也可以这样
[9]arr=10;
//但是不建议这样,代码看起来不直观

2. ()函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

#include <stdio.h>
 void test1()
 {
	 printf("hello\n");
 }
 void test2(char *str)
 {
	 printf("%s\n", str);
 }
 int main()
 {
	 test1();            //实用()作为函数调用操作符。
	 test2("hello world.");//实用()作为函数调用操作符。
	 return 0;
 }

3. 访问一个结构的成员

. 结构体.成员名

-> 结构体指针->成员名

#include <stdio.h>
struct Stu
{
 	char name[10];
	 int age;
 	char sex[5];
 	double score;
 };
void set_age1(struct Stu stu) {
	 stu.age = 18;
 }
void set_age2(struct Stu* pStu) {
	 pStu->age = 18;//结构成员访问
}
int main()
{
	 struct Stu stu;
	 struct Stu* pStu = &stu;//结构成员访问

	 stu.age = 20;//结构成员访问
	 set_age1(stu);

 	pStu->age = 20;//结构成员访问
	 set_age2(pStu);
	 return 0;
}

到此这篇关于C语言全面细致精讲操作符的使用的文章就介绍到这了,更多相关C语言操作符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言 操作符分类解析与使用

    目录 操作符的分类 算术操作符 移位操作符 位操作符 逻辑操作符 逗号表达式 表达式求值 隐式类型转换 算术转换 操作符的属性 xwg今天就带各位大佬来了解一波C语言的操作符. 操作符的分类 常见的操作符分别如下: 算术操作符 移位操作符 位操作符 逻辑操作符 逗号表达式 算术操作符 算术操作符是我们最常用的操作符:+ - * / % 注: 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数. 对于 / 操作符如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法.

  • 详解C语言之操作符

    目录 1.加减乘 2.除(/) 注意: 3.取余(%) 注意: 4.移位操作符(>> <<) 注意 5.位操作符(| ,& ,^) 6.逻辑操作符(&& , ||) 7.单目操作符 7.1正负号(+ -) 7.2sizeof() 7.3按位取反(~) 7.4逻辑反操作(!) 8.赋值操作符 9.复合操作符.等式左边不是常量 补充: 总结 1.加减乘 c里的加减乘同我们实际生活功能相同,我们不做探究,看例子即可 2.除(/) c语言里的除法实质上是求商操作(零

  • C语言实例上手深入理解操作符的使用

    目录 1.闰年练习 2.绝对值练习 3.字符转换练习 4.四则表达式练习 5.隐式类型转换 1.闰年练习 编写逻辑表达式判断用户给定的年份是否是闰年,年份可以被4整除但不能被100整除:年份可以被400整除. #include <stdio.h> int main(){ int year = 0 ,res = 0; printf("请输入年份数字:"); scanf("%d",&year); res = (!(year % 400)) || (!

  • C语言选择、循环、函数、数组与操作符

    目录 1.选择语句 2.循环语句 3.函数 4.数组 5.操作符 5.单目操作符 6.关系操作 7.逻辑操作符 8.条件操作符 9.逗号表达式 10.下标引用.函数调用和结构成员 1.选择语句 如果你好好学习,校招时拿一个好offer,走上人生巅峰.如果你不学习,毕业等于失业,回家卖红薯.这就是选择! #include<stdio.h> int main() {     int a = 0;     printf("1:好好学习,拿大厂offer     2.宿舍摆烂,毕业即失业\n

  • C语言各种操作符透彻理解下篇

    1.单目操作符 之前有了解到的三目操作符(?:),指的是有三个操作数 例如:3+5 其中,+是一个操作符 3是左操作数 5是有操作数 +则是一个双目操作符 那么什么是单目操作符呢,也就是只有一个操作数的 我们常见的操作符有:  这里我们来详细介绍一下sizeof.~.++与-- 1.sizeof sizeof常用来计算类型的长度,比如数组类型,int.char.short等等.同时,sizeof是操作符,不是函数,所以后面的括号可以省略.但算类型长度的时候不能省,这是语法要求. 下面就是size

  • C语言操作符超详细讲解下篇

    目录 前言 赋值操作符 单目操作符 单目操作符介绍 sizeof 和 数组 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用与函数调用和结构成员 [ ] 下标引用操作符 ( ) 函数调用操作符 访问一个结构的成员 表达式求值 隐式类型转换-整形提升 算术转换 操作符的属性 总结 前言 本文接着学习操作符的内容. 赋值操作符 赋值操作符就是能够重新赋值 int weight = 120;//体重 weight = 89;//不满意就赋值 double salary = 10000.0; s

  • C语言操作符超详细讲解上篇

    目录 前言 1.操作符的分类 2.算术操作符 3.移位操作符 3.1 左移操作符 3.1.1 正数左移1位 3.1.2 负数左移1位 3.2 右移操作符 3.2.1 正数右移1位 3.2.2 负数右移1位 3.3 移位操作符说明 4.位操作符 4.1 练习 1 4.2 练习 2 总结 前言 操作符主要内容包括:各种操作符的介绍,用表达式求值. 1.操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用.函数调用和结构成员

  • C语言各种操作符透彻理解上篇

    前言:在我们程序编写领域,操作符给我们提供了很多的运算便利,但操作符琳琅满目,我们要怎样用好它们呢,下面就带你来熟悉熟悉这些多样的操作符. 操作符分类: 算术操作符 .移位操作符 .位操作符 .赋值操作符 .单目操作符 .关系操作符 .逻辑操作符 .条件操作符 .逗号表达式 .下标引用.函数调用和结构成员 1.算数操作符(+.--.*.%./) 这里我们着重讲一下取余(模)%操作符和除法/操作符 #include<stdio.h> int main() { //取余(模).除法 int ret

  • C语言 操作符#与##使用方法详解

    目录 一.# 运算符 二.## 运算符 三.小结 一.# 运算符 # 运算符用于在预处理期将宏参数转换为字符串 # 的转换作用是在预处理期完成的,因此只在宏定义中有效 编译器不知道 # 的转换作用 用法: #define STRING(x) #x printf("%s\n",STRING(Hello World!)); 下面通过一个示例感受一下: test.c: #include <stdio.h> #define STRING(x) #x int main() { pri

  • C语言全面细致精讲操作符的使用

    目录 前言 一.算术操作符 二.移位操作符 1.左移操作符 2.右移操作符 三.位操作符 四. 赋值操作符 复合赋值符 五.单目操作符 单目操作符介绍 1.sizeof 和 数组 2.++和–运算符 六.关系操作符 七.逻辑操作符 八.条件操作符 九.逗号表达式 十.下标引用与函数调用和结构成员 1. []下标引用操作符 2. ()函数调用操作符 3. 访问一个结构的成员 前言 本次文章我们要讲各种操作符的介绍,内容非常详细,大家拭目以待哦! 首先介绍操作符的种类 操作符分类: 算术操作符 移位

  • C语言全面细致精讲关键字的使用

    目录 1.switch 深入理解 2.如何正确的使用 case 3.循环语句while for do while深度讲解 4.continue的作用是什么 5.goto真的没人用了吗 6.void 到底是何方妖怪 1.switch 深入理解 学习过C语言的小伙伴可能知道,switch 也是选择结构的一种,是具有判定能力的语法结构,那么他们都必须具备:判定+分支功能! 我们知道 if 可以搭配 else if 或 else 来实现分支功能,那么我们 switch 如何实现分支功能呢?这样,我们先来

  • C语言字符串函数与内存函数精讲

    目录 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror tolower\toupper memcpy memmove memcmp memset strlen 获取字符串长度. strlen - size_t strlen( const char *string ); 1.字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’). 2.参数指向的

  • C语言八道笔试题精讲带你掌握指针

    目录 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 为了题目的准确性和我们一般学习过程中的习惯,这里所有的题目代码都是在 X86 环境(32 位平台)下运行的. 题目一 #include <stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int* ptr = (int*)(&a + 1); printf("%d,%d", *(a + 1), *(ptr - 1)); return 0; } /

  • Mysql数据库的主从复制与读写分离精讲教程

    目录 前言 一.MySQL主从复制 1.支持的复制类型 2.主从复制的工作过程是基于日志 3.请求方式 4.主从复制的原理 5.MySQL集群和主从复制分别适合在什么场景下使用 6.为什么使用主从复制.读写分离 7.用途及条件 8.mysql主从复制存在的问题 9.MySQL主从复制延迟 二.主从复制的形式 三.读写分离 1.原理 2.为什么要读写分离呢? 3.什么时候要读写分离? 5.目前较为常见的MySQL读写分离 四.案例实施 1.案例环境 2.实验思路(解决需求) 3.准备 4.搭建My

  • Java基础精讲方法的使用

    目录 一.方法 二.方法的重载 三.方法递归 四.小结 一.方法 方法是什么? 在Java中方法就相当于C语言中的函数.因为有时候我们需要一块代码重复使用,这时候就可以使用方法. 为什么要用方法? 1. 是能够模块化的组织代码 ( 当代码规模比较复杂的时候 ). 2. 做到代码被重复使用 , 一份代码可以在多个位置使用 . 3. 让代码更好理解更简单 . 4. 直接调用现有方法开发 , 不必重复造轮子 方法的基本语法格式: public static 返回类型 方法名称(形参列表){} 在这里要

  • C语言深入细致讲解动态内存管理

    目录 为什么存在动态内存管理 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 对NULL指针的解引用操作 对动态开辟空间的越界访问 对非动态开辟内存使用free访问 使用free 释放一块动态开辟内存的一部分 对一块动态内存多次释放 对动态内存开辟忘记释放 柔性数组 小结 为什么存在动态内存管理 我们已经掌握的内存开辟方式有: int val = 20;//在栈空间上开辟四个字节 char arr[10] = { 0 };//在栈空间上开辟10个字节

  • C/C++堆区专篇精讲

    目录 malloc free new delete memcpy memset malloc malloc开辟堆区内存.头文件stdlib.h,函数原形如下. void*malloc(size_tsize); //返回值void指针,该指针就是开辟的内存地址,参数是开辟的字节数. free free释放堆区开辟的内存.头文件stdlib.h,函数原形如下. voidfree(void*ptr); // 参数传入需要释放的堆区内存首地址. 程序: #include<iostream> #incl

  • 易语言中的命令及操作符知识点总结

    命令由运行支持库提供给用户在程序中使用,它们被分为很多类.有些命令的最后一个参数可以被扩展,譬如"相加",它的"加数"参数可以被无限制地扩展,用作支持连续相加.这些命令在录入到程序中后在编辑窗口内其首部会显示出一个右双箭头作为标志.命令中的某些参数也有可能可以被省略,即调用时可以不提供参数数据.具体情况请参阅<支持库手册>. 下面列出所有具有操作符的命令及其操作符运算优先级,值越小运算优先级越高.优先级高的命令在计算表达式时将被先执行,同优先级的命令按顺

  • vue-路由精讲 二级路由和三级路由的作用

    1.我们继续上一个案例 vue -- 路由精讲制作导航 -- 从无到有 ,在 about文件夹下 创建一些文件夹.如下: 2.编写about.vue代码.当我们点击导航中 "关于我们" ,就会显示该部分内容.代码中写了四个可供点击后可以跳转的模块.和 <router-view></router-view> 表示你点击了哪个组件,哪个组件就会渲染到这里来. 其中注意:css样式,我们直接引入bootstrap中的导航的样式,在标签中直接添加class属性的值就可以

随机推荐