返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言全面细致精讲操作符的使用
  • 678
分享到

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

2024-04-02 19:04:59 678人浏览 薄情痞子
摘要

目录前言一、算术操作符二、移位操作符1.左移操作符2.右移操作符三、位操作符四、赋值操作符复合赋值符五、单目操作符单目操作符介绍1.sizeof 和 数组2.++和–运算

前言

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

首先介绍操作符的种类

操作符分类:

  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语言操作符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言全面细致精讲操作符的使用

本文链接: https://lsjlt.com/news/148354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言全面细致精讲操作符的使用
    目录前言一、算术操作符二、移位操作符1.左移操作符2.右移操作符三、位操作符四、赋值操作符复合赋值符五、单目操作符单目操作符介绍1.sizeof 和 数组2.++和–运算...
    99+
    2024-04-02
  • C语言全面细致精讲关键字的使用
    目录1、switch 深入理解2、如何正确的使用 case3、循环语句while for do while深度讲解4、continue的作用是什么5、goto真的没人用了吗6、voi...
    99+
    2024-04-02
  • C语言全面细致讲解文件操作
    目录什么是文件程序文件数据文件文件名文件指针文件的打开和关闭文件的顺序读写字符输入输出函数字符串输入输出函数(fgets,fputs)格式化输入输出函数(fscanf,fprintf...
    99+
    2024-04-02
  • C语言各类操作符全面讲解
    目录1 算术操作符2 移位操作符3 位操作符4 赋值操作符5 单目操作符5.1 ! 逻辑反操作5.2 sizeof 和数组6 关系操作符7 逻辑操作符8 条件操作符9 逗号表达式10...
    99+
    2024-04-02
  • C语言全面细致讲解单双精度float与double的使用方法
    目录一、float与double类型介绍二、例题三、总结一、float与double类型介绍 代码: #include <stdio.h> int main (void)...
    99+
    2024-04-02
  • C语言全面讲解顺序表使用操作
    目录一、顺序表的结构定义二、顺序表的结构操作1.初始化2.插入操作3.删除操作4.扩容操作5.释放操作6.输出三、示例编程环境为 ubuntu 18.04。 顺序表需要连续一片存储空...
    99+
    2024-04-02
  • C语言操作符超详细讲解下篇
    目录前言赋值操作符单目操作符单目操作符介绍sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用与函数调用和结构成员[ ] 下标引用操作符( ) 函数调用操作符访问一...
    99+
    2024-04-02
  • C语言操作符超详细讲解上篇
    目录前言1、操作符的分类2、算术操作符3、移位操作符3.1 左移操作符3.1.1 正数左移1位3.1.2 负数左移1位3.2 右移操作符3.2.1 正数右移1位3.2.2 负数右移1...
    99+
    2024-04-02
  • Java全面细致讲解Wrapper的使用
    目录一、概述二、作用三、使用1. 基本数据类型-包装类的实例(装箱)2. 包装类-基本数据类型(拆箱)3. String-基本数据类型/包装类4. 基本数据类型/包装类-String...
    99+
    2024-04-02
  • Java全面细致讲解final的使用
    目录一、理解二、作用1. 修饰-类2. 修饰-方法3. 修饰-变量3.1 修饰-成员变量(属性)3.2 修饰-局部变量三、经典题目一、理解 final:最终的 二、作用 final ...
    99+
    2024-04-02
  • C语言数组全面详细讲解
    目录1.基础知识2.数组的分类2.1按元素类型分类2.2按维数分类3.数组定义和初始化3.1 一维数组3.2 二维数组4.数组元素的引用方法5.字符数组的定义1.基础知识 C语言中使...
    99+
    2024-04-02
  • C语言简明讲解操作符++和--的使用方法
    目录一、++与--操作符的本质二、++与-- 操作符使用分析三、小结一、++与--操作符的本质 ++ 和 -- 操作符对应两条汇编指令 前置 变量自增(减)1取变量值 后置 取变量值...
    99+
    2024-04-02
  • Java全面细致讲解==和equals的使用
    目录equals与==1. ==的使用1.1 概述1.2 代码演示2. equals的使用2.1 概述2.2 代码演示3. ==和equals的区别3.1 概述3.2 代码演示上篇博...
    99+
    2024-04-02
  • C语言超详细讲解文件的操作
    目录一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名三、文件指针四、文件的打开和关闭五、文件的顺序读写六、文件的随机读写fseekftellrewind七、文件结束...
    99+
    2024-04-02
  • C语言详细讲解注释符号的使用
    目录一、注释规则二、注释中一个有趣的问题三、教科书型注释四、迷惑型的注释五、忽悠型注释六、搞笑型注释七、漂亮的程序注释八、小结一、注释规则 编译器在编译过程中使用空格替换整个注释字符...
    99+
    2024-04-02
  • C语言详细讲解位运算符的使用
    目录一、位运算符分析二、小贴士三、位运算与逻辑运算四、小结一、位运算符分析 C语言中的位运算符 位运算符直接对 bit 位进行操作,其效率最高。 &按位与|按位或^按位异或~...
    99+
    2024-04-02
  • C语言超全面覆盖操作符知识点
    目录算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符算术操作符 主要是 (+ - * / %) 五种算数操作符。 1、除了 % 操作符之外,其他的几个操...
    99+
    2024-04-02
  • C语言详细讲解接续符和转义符的使用
    目录一、接续符的意义二、接续符的使用三、转义符的意义四、转义符的使用五、转义符和其他的语法混合六、小结一、接续符的意义 C语言中的接续符(\)是指示编译器行为的利器 下面看一段接续符...
    99+
    2024-04-02
  • C语言详细讲解逻辑运算符的使用
    目录一、&& 与 II 分析二、!分析三、小结一、&& 与 II 分析 下面的程序运行结束后,i, j,k 的值分别为多少? #include <...
    99+
    2024-04-02
  • C语言超全面讲解字符串函数
    目录1、gets函数2、puts函数3、strcat函数4、strcpy函数(strncpy函数)5、strcmp函数(strncmp函数)6、strlen函数7、strlwr函数8...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作