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

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;
	/*if (a > b)
		max = a;
	else
		max = b;*/

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

(0)

相关推荐

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

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

  • C语言中单目操作符++、–的实例讲解

    目录 前言 ++单目操作符 - -单目操作符 附1: 代码演示: 演示代码提取: 总结 前言 大家先判断下下面代码的运行结果 答案: 如果你全对了,那么恭喜大佬,这篇博客可能对你收益不大,全当复习好了,这是专门针对编程小白初学单目操作符++.- -的讲解,诚挚地希望能够到xdm.接下来我将开始我的讲解,手把手带xdm拿捏这两个操作符的运算. ++单目操作符 可分为前置++和后置++ 1.前置++,变量先++(一般情况下+1)完以后再运算 2.后置++,变量先运算完以后再++(一般情况下+1) -

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

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

  • 一篇文章带你了解C语言操作符

    目录 一.操作符分类 二.算术操作符 三.移位操作符 1.左移操作符 2.右移操作符 2.1算术移位 2.2逻辑移位 四.位操作符 1.按位与 2.按位或 3.按位异或 4.一道练习题 五.赋值操作符 1.赋值操作符(=)是一个很棒的操作符,他可以让你得到一个你之前不满意的值.也就是你可以对其重新赋值. 2.赋值操作符可以连续使用 3.复合赋值符 六.单目操作符 1.逻辑反操作 2.取地址 3.sizeof 4.++和--运算符 4.1前置++和-- 4.2后置++和-- 七.关系操作符 八.逻

  • C语言操作符基础知识图文详解

    目录 1.算术操作符 + - * / % 2.移位操作符 >> (右移操作符) <<(左移操作符) 左移操作符:<< 右移操作符:>> 3.位操作符 3.1 & 按位与 3.2 | 按位或 3.3 ^ 按位异或 3.4 ~ 按位取反 4.赋值操作符 = 5.逻辑操作符 5.1 ! 非 5.2 && 与 5.3 || 或 6.条件运算符 ? 7.单目操作符 7.1 ! 7.2 + 正值 7.3 - 负值 7.4 & 取地址 7.

  • C语言操作符基础知识详解

    目录 一.单目操作符: 二.关系操作符 三.条件操作符 四.逗号表达式 五.逻辑操作符 总结 一.单目操作符: !:逻辑反操作符: -:负数操作符: +:整数操作符: &:取地址操作符: sizeof:操作数的类型长度操作符: sizeof(数组名)--数组名表示整个数组,sizeof(数组名)求的是整个数组的大小,单位是字节 例如: int a[10] = { 0 }; printf("%d\n",sizeof(a)); suzeof(a[0]);-->(4) 不同的表

  • C语言入门篇--充分理解操作符

    目录 1.算术操作符 1.1除法运算 1.2取模运算 2.移位操作符 相关知识 1.移位运算是站在二进制角度移位的 2.左移右移,原始变量值不发生变化除非给原始变量赋值 3.整数移位运算不能整除时,只保留整数部分 4.C语言中的移位运算符 5.移位分为算术移左移.算术移右移和逻辑左移.逻辑右移 3.位操作符 3.1按位与& 3.2按位或 | 3.3异或 ^ 4.赋值操作符 5.单目操作符 5.1 逻辑反操作 ! 5.2 负值 - 正值 + 5.3 取地址 & 5.4 取反 ~ 5.5 前置

  • 详解C语言之操作符

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

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

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

  • 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语言指针超详细讲解下篇

    目录 前言 指针运算 指针±整数 4.1 指针±整数 4.2 指针-指针 4.3 指针的关系运算 5.指针和数组 6.二级指针 7.指针数组 7.1 举例 1 7.2 举例 2 总结 前言 本文接着上一篇内容,继续学习指针相关知识点. 指针运算 指针±整数 指针-指针 指针的关系运算 4.1 指针±整数 #define VALUE 5 int main() { float values[VALUE]; float *vp; //指针+-指针,关系运算 for (vp = &values[0];

  • C语言函数超详细讲解下篇

    目录 前言 函数的声明和定义 函数声明 函数定义 举例 简单的求和函数 把加法单独改写成函数 添加函数声明 带头文件和函数声明 静态库(.lib)的生成 静态库文件的使用方法 函数递归 什么是递归? 递归的两个必要条件 练习1 一般方法 递归的方法 练习2 一般方法 递归方法 练习3 一般方法 递归方法 练习4 一般方法 递归方法 递归与迭代 递归隐藏的问题 如何改进 选递归还是迭代 总结 前言 紧接上文,继续学习函数相关内容. 函数的声明和定义 函数声明 告诉编译器有一个函数叫什么,参数是什么

  • C语言数组超详细讲解下篇扫雷

    目录 前言 1.扫雷是什么? 2.程序框架 2.1 主函数 2.2 函数menu 2.3 函数game 2.3.1 函数init_board 2.3.2 函数show_board 2.3.3 函数set_mine 2.3.4 函数find_mine 2.3.5 函数get_mine_count 3.头文件.h 4.游戏试玩 总结 前言 本文接着复习前面所学知识,以扫雷游戏为例. 1.扫雷是什么? 百度百科:<扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子

  • C语言各类操作符全面讲解

    目录 1 算术操作符 2 移位操作符 3 位操作符 4 赋值操作符 5 单目操作符 5.1 ! 逻辑反操作 5.2 sizeof 和数组 6 关系操作符 7 逻辑操作符 8 条件操作符 9 逗号表达式 10 下标引用函数调用和结构成员 10.1 [ ]下标引用操作符 10.2 ()函数调用操作符 10.3 访问一个结构的成员 11 表达式求值 11.1 整形提升 11.2 优先级和结合性 总结 1 算术操作符 + - * / % +,-和*操作数我就不多说了,这里我们重点来 / 和% /操作数

  • 对C语言中指针的理解与其基础使用实例

    C语言的指针,关键意思在于"指". "指"是什么意思? 其实完全可以理解为指示的意思.比如,有一个物体,我们称之为A.正是这个物体,有了这么个称谓,我们才能够进行脱离这个物体的实体而进行一系列的交流.将一个物体的指示,是对这个物体的抽象.有了这种抽象能力,才有所谓的智慧和文明.所以这就是"指示"这种抽象方法的威力. 退化到C语言的指针,指针是一段数据/指令(在冯诺易曼体系中,二者是相通,在同一空间中的)的指示.这是指示,也就是这段数据/指令的起始

随机推荐