iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言各种操作符透彻理解下篇
  • 798
分享到

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

2024-04-02 19:04:59 798人浏览 泡泡鱼
摘要

1.单目操作符 之前有了解到的三目操作符(?:),指的是有三个操作数 例如:3+5 其中,+是一个操作符 3是左操作数 5是有操作数 +则是一个双目操作符 那么什么是单目操作符呢,也

1.单目操作符

之前有了解到的三目操作符(?:),指的是有三个操作数

例如:3+5

其中,+是一个操作符

3是左操作数

5是有操作数

+则是一个双目操作符

那么什么是单目操作符呢,也就是只有一个操作数的

我们常见的操作符有:

 这里我们来详细介绍一下sizeof、~、++与--

1.sizeof

sizeof常用来计算类型的长度,比如数组类型,int、char、short等等。同时,sizeof是操作符,不是函数,所以后面的括号可以省略。但算类型长度的时候不能省,这是语法要求。

下面就是sizeof一些常用的用法


#include<stdio.h>
int main()
{
	//sizeof
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
 
	int arr[10] = { 1,2,3,4,5,6,7 };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(int[10]));//计算整个数组的长度
 
	printf("%d\n", sizeof a);
	//printf("%d\n", sizeof int);这样写是会报错的
 
 
	return 0;
}

计算出的结果如下:

2.~

~的主要作用就是对一个数的二进制按位取反,但同样的,最后打印出来的是原码


#include<stdio.h>
int main()
{
    int a = 0;
	//~按(内存中补码的2进制)位取反
	//00000000000000000000000000000000
	//11111111111111111111111111111111 - 补码
	//11111111111111111111111111111110 - 反码
	//10000000000000000000000000000001 - 原码 --> -1
 
	printf("%d\n", ~a);
 
	return 0;
}

运行结果如下:

 这里有个~的应用:

怎样将一个数进行复原


#include<stdio.h>
int main()
{
    int a = 10;
	a |= (1 << 2);
	printf("%d\n", a);
	a &= ~(1 << 2);
	printf("%d\n", a);
    return 0;
 
	//如果只想把倒数第三个数,也就是0改为1,可以进行以下操作
	//00000000000000000000000000001010
	//00000000000000000000000000000100   1<<2(用a与1<<2异或来实现)
	//00000000000000000000000000001110
	//11111111111111111111111111111011   ~(1<<2)(要想将a复原,就是再将倒数第三个数变为0)
	//00000000000000000000000000001010
}

3.++与--

这里主要注意的是分前置与后置

前置++/--:先加/减再使用

后置++/--:先使用再加/减 

a每加一次就会记录,总共加了两次,所以是3。

对于b,先使用了a的值再对a进行++,所以是1.

到c这里,a实际上已经变成2了,而c是先对a进行加1再用它的值,所以c为3。

4.*(解引用操作符)


#include<stdio.h>
int main()
{
    int a = 10;
	int* pa = &a;
	*pa = 20;//通过*来访问a的地址
	printf("%d\n", a);
	printf("%d\n", *pa);//此时的*pa就是a的值
 
	int* px = &*pa;//px通过*来访问*pa,也就是访问a
	*px = 30;
	printf("%d\n", a);
    return 0;
}

2.关系操作符

3.逻辑操作符

(只关注变量的真假)

来看一道360的笔试题,判断一下程序输出的结果是多少。

我们先来看下第一种,a是先使用再进行++,这里a是0,是0则为假,那么后面的就都不要看了,还是原来的结果,但a进行了++ 

 再看第二种,先打个比方,我想让张三或者李四,一个来我办公室,张三来了,那李四来不来就已经无所谓了,这里也是一样,a先使用再++,则a=0,表示没有人来,没人来就继续进行,b是先++再使用,b=3,为真,就是有人来了,有人来了以后,后面的来不来都无所谓,所以d就不再进行,最后输出的结果就是1334.

 (做个小总结:&&---左操作数为假,右边不计算     ||---左操作数为真,右边不计算)

4.条件操作符

(也叫三目操作符--->exp1 ? exp2 : exp3 )


#include<stdio.h>
int main()
{
    int a = 10;
	int b = 20;
	int max = 0;
	
 
	max = (a > b ? a : b);//与上面那段代码等价
    return 0;
}

5.逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 首先,我们来分析一个代码: 下面输出的c是多少?


    int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);

我们来看括号里面的式子,像a>b、a这样子的对a和b毫不起作用,可以直接忽略掉,然后a=b+10,这里a变成了12,最后b=a+1=13.所以结果是13.

不难发现,最后起作用的是最后一个表达式的结果。

6.下标引用、函数调用和结构成员

1. [  ] 下标引用操作符

操作数:一个数组名+一个索引

 2.( )函数调用操作符

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


#include<stdio.h>
 
void menu()
{
    printf("*************************\n");
	printf("******    hello    ******\n");
	printf("******   friends   ******\n");
	printf("*************************\n");
}
 
int main()
{
    menu();
    return 0;
}

 3.访问一个结构的成员

. 结构体.成员名

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


#include<stdio.h>
 
struct Stu
{
    char name[10];
    int age;
    double score;
};
 
int main()
{
    struct Stu s = { "zhangsan",20,85.5 };
	//.
	printf("%s %d %.1lf\n", s.name, s.age, s.score);
	//->
	struct Stu* ps = &s;
	printf("%s %d %.1lf\n", (*ps).name, (*ps).age, (*ps).score);
	printf("%s %d %.1lf\n", ps->name, ps->age, ps->score);
    return 0;
}

这三种情况输出的结果一样,感兴趣的同学可以自己去试一下!

7.隐式类型转换

例如:


#include<stdio.h>
int main()
{
    short s = 20;
	int a = 5;
	printf("%d\n", sizeof(s = a + 4));
	printf("%d\n", s);
    return 0;
}

sizeof输出的结果是2,这里面int型的a被转化为short型。

8.操作符的属性

复杂表达式的求值有三个影响的因素:

1.操作符的优先级

2.操作符的结合性

3.是否控制求值顺序

两个相邻的操作符先执行哪个,取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

// 表达式的求值部分由操作符的优先级决定。

// 表达式 1

a * b + c * d + e * f

在计算的时候,由于*比+的优先级高,只能保证,*的计算是比+早,但是优先级并不

能决定第三个 * 比第一个 + 早执行。

// 表达式2

c + -- c ;

同上,操作符的优先级只能决定自减-- 的运算在 + 的运算的前面,但是我们并没有办法得 知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义 的。

// 代码 3- 非法表达式
int main ()
{
int i = 10 ;
i = i -- - -- i * ( i = - 3 ) * i ++ + ++ i ;
printf ( "i = %d\n" , i );
return 0 ;
}

我们在写代码的时候,难免会为一些小细节而头痛,只有在我们熟练掌握这些知识的时候才能避免这些尴尬的小问题,希望操作符详解能对你有些帮助!

到此这篇关于C语言各种操作符透彻理解下篇的文章就介绍到这了,更多相关C语言 操作符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言各种操作符透彻理解下篇

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言各种操作符透彻理解下篇
    1.单目操作符 之前有了解到的三目操作符(?:),指的是有三个操作数 例如:3+5 其中,+是一个操作符 3是左操作数 5是有操作数 +则是一个双目操作符 那么什么是单目操作符呢,也...
    99+
    2022-11-13
  • C语言各种操作符透彻理解上篇
    前言:在我们程序编写领域,操作符给我们提供了很多的运算便利,但操作符琳琅满目,我们要怎样用好它们呢,下面就带你来熟悉熟悉这些多样的操作符。 操作符分类: 算术操作符 、移位操作符 、...
    99+
    2022-11-13
  • C语言各种符号的使用介绍下篇
    目录1、按位运算符1.1 按位或( | )和按位与( & )1.2 按位异或( ^ )1.3 一个关于整型提升的问题2、移位操作符2.1 左移<< 右移>&...
    99+
    2022-11-13
    C语言符号 C语言符号的使用
  • C语言操作符超详细讲解下篇
    目录前言赋值操作符单目操作符单目操作符介绍sizeof 和 数组关系操作符逻辑操作符条件操作符逗号表达式下标引用与函数调用和结构成员[ ] 下标引用操作符( ) 函数调用操作符访问一...
    99+
    2022-11-13
  • C语言一篇精通链表的各种操作
    目录前言一、链表的介绍1.什么是链表2.链表的分类2.1.根据方向2.2.头结点2.3.循环/非循环 二、链表的实现1.结构体2.开辟结点3.打印4.尾插5.头插6.测试7...
    99+
    2022-11-13
  • C语言入门篇--充分理解操作符
    目录1.算术操作符1.1除法运算1.2取模运算2.移位操作符相关知识1.移位运算是站在二进制角度移位的2.左移右移,原始变量值不发生变化除非给原始变量赋值4.C语言中的移位运算符5....
    99+
    2022-11-12
  • C语言数组的各种操作梳理
    目录一、一维数组1.创建2.初始化3.使用4.数组在内存中的存储5.数组大小的计算二、二维数组1.创建2.初始化3.使用4.二维数组在内存中的存储三、数组作为函数参数1.关于数组名是...
    99+
    2022-11-13
  • C语言各类操作符全面讲解
    目录1 算术操作符2 移位操作符3 位操作符4 赋值操作符5 单目操作符5.1 ! 逻辑反操作5.2 sizeof 和数组6 关系操作符7 逻辑操作符8 条件操作符9 逗号表达式10...
    99+
    2022-11-13
  • 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+
    2022-11-13
  • 一篇文章带你了解C语言操作符
    目录一、操作符分类 二、算术操作符三、移位操作符1、左移操作符 2、右移操作符2.1算术移位 2.2逻辑移位 四、位操作符 1、按位...
    99+
    2022-11-12
  • C语言中各种操作符的详细介绍(纯干货!)
    目录算术操作符移位操作符位操作符赋值操作符 单目操作符(类型)   强制类型转换       ...
    99+
    2022-11-12
  • C语言超详细讲解顺序表的各种操作
    目录顺序表是什么顺序表的结构体顺序表的接口函数顺序表相关操作的菜单顺序表的初始化添加元素陈列元素往最后加元素往前面加元素任意位置加元素删除最后元素删除前面元素 删除任意元素...
    99+
    2022-11-13
  • C语言由浅入深讲解文件的操作下篇
    目录文件的顺序读写字符输入输出fgetc和fputcfgetcfputc:文本行输入输出函数fgets和fputsfgets:fputs:格式化输入输出函数fscanf和fprint...
    99+
    2022-11-13
  • C语言详解无头单向非循环链表各种操作方法
    目录链表引入链表介绍创建链表打印链表创建结点单链表尾插单链表头插单链表尾删单链表头删在pos位置之前插入数据在pos位置之后插入数据删除pos位置结点删除pos位置之后的结点销毁链表...
    99+
    2022-11-13
  • C语言冷知识之预处理字符串操作符详解
    目录在C语言中什么是标记预处理字符串操作符#字符串化操作符##标记(Token)连接操作符当年学习C语言的第一门课就提到过标记(Token)的概念,不过,相信在多年之后你再次听到这个...
    99+
    2022-11-16
    C语言 预处理字符串操作符 C语言 字符串操作符 C语言 操作符
  • C语言实例上手深入理解操作符的使用
    目录1.闰年练习2.绝对值练习3.字符转换练习4.四则表达式练习5.隐式类型转换1.闰年练习 编写逻辑表达式判断用户给定的年份是否是闰年,年份可以被4整除但不能被100整除;年份可以...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作