C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区-51CTO.COM

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)

hackernew
发布于 2021-2-23 09:31
浏览
0收藏

操作符知识比较杂乱,这里我按照优先级从高向低的顺序进行整理,优先度越高运算中约先进行

由于本人能力有限,有一些遗漏或者错误还希望大家斧正


文章目录

 

优先度最高((),[ ],->,.)
优先级2级(!,~,++,- -,-(负号),*(指针),&(取地址),sizeof)
优先级3级(*(乘法),/,%)

 

优先度最高((),[ ],->,.)


1,( )操作符
含义:函数调用操作符。

操作数是函数名以及函数内部的传参数。

 

eg: test()操作数是函数名test。
test(x,y)操作数是test ,x,y(函数名+内部的传参数)

 

注意函数调用操作符只要是函数就必须有

eg: sizeof()的括号可以省略,说明sizeof不是函数,是一种操作符。

 

强制类型转化
(强制转化类型)

#include <stdio.h>
int main()
{
	int a =(int)3.14 ;
	printf("a=%d ",a);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

结合性(同优先级操作符在语句中的“运算优先级(或叫顺序) 从左向右。

 

2,[ ]操作符

含义:下标运算操作符

eg:
arr[4] 操作数为arr和4。

结合性:从左向右

 

3,->操作符

含义:指向结构体成员操作符。

eg:

#include<stdio.h>
struct student
{
	//结构体的成员
	char name[20];
	int age;
	char sex[5];
};
int main()
{
	//结构体访问操作符是建立在结构体上的
	struct student s = { "小红",18,"woman" };//初始化结构体
	struct student* ps = &s;
	/*printf("%s",(*ps).name);*/
	printf("%s",ps->name);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

作用:通过指针找到结构体变量中的成员。

结合性:从左向右。

 

4, . 操作符

含义:结构体成员运算符。

eg:

#include<stdio.h>
struct student
{
	//结构体的成员
	char name[20];
	int age;
	char sex[5];
};
int main()
{
	//结构体访问操作符是建立在结构体上的
	struct student s = { "小红",18,"woman" };//初始化结构体
	printf("%s",s.name);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include<stdio.h>
struct student
{
	//结构体的成员
	char name[20];
	int age;
	char sex[5];
};
int main()
{
	//结构体访问操作符是建立在结构体上的
	struct student s = { "小红",18,"woman" };//初始化结构体
	struct student* ps = &s;
	printf("%s",(*ps).name);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

用来找到结构体变量中的成员。

结合性:从左到右

 

优先级2级(!,~,++,- -,-(负号),*(指针),&(取地址),sizeof)


1,!操作符

含义:逻辑非运算(单目运算符)

由真到假,由假到真(0为假,非0为真默认为1)

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

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

数据的多组输入

#include <stdio.h>

int main()
{
	int x = 0;
	while (scanf("%d", &x) != EOF)
	{
		if (x >= 140)
			printf("Genius\n");
		else
			printf("Not Genius\n");
	}
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

(文件读取到最后返回一个EOF,EOF本质是-1为真,!EOF为0,程序就会停下来来实现多组输入)

在判断语句中使用

#include <stdio.h>
int main()
{
	int input = 0;
	if (!input)//如果input为假执行
	{
		//....
	}
	if (input)//如果input为真执行
	{
		//....
	}
	return 0;
}

结合性:从右向左

 

2, ~操作符

含义:按位取反运算符(单目操作符)
(按二进制位取反)

方法:

真变假,假变真。

在二进制位中0变1,1变0;

-----------------------------------------------------------------

首先我们要知道

整数在计算机中存的是它的补码

原码——>反码——>补码

 

三者的运算规则为

原码按位取反(符号位不变)——>反码。

反码+1——>补码。

在32位计算机中首位是符号位
表示正负不表示大小。

首位为1表示负数,首位为0表示正数。

eg(都是32位)

10000000000000000000000000000001表示-1

00000000000000000000000000000001表示1

对于正整数规定,它的原码,反码,补码都相同可以直接用。

对于负数计算机存的补码不等,要转成原码才可以直到其大小。

eg:
1 1 1 1 1…1 1(32位)(符号位1说明是负数)补码

1 1 1 1 1…1 0(32位)(补码-1到反码)

1 0 0 0 0…0 1(32位)(符号位不变其余位按位取反到原码)

原码首位为1说明是负数,发现值数字-1。

-----------------------------------------------------------------

所以-1在计算机中储存的是32个1

-1取反为32个0是0

而文件读取失败返回EOF本质是-1

0在计算机会判断为假

所以连续输入还可以写为

int main()
{
	int x = 0;
	while (~scanf("%d", &x) )
	{
		if (x >= 140)
			printf("Genius\n");
		else
			printf("Not Genius\n");
	}
	return 0;
}

 

3,++操作符

含义:自增运算符(单目操作符)

分为前置++和后置++(他们运算顺序不同)

前置++

先++再在使用。

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

 

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include <stdio.h>
int main()
{
 int a = 10;
 printf("a=%d ",++a);
 return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include <stdio.h>
int main()
{
	int a = 10;
	printf("a=%d ",++a);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

后置++

先使用再++

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

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include <stdio.h>
int main()
{
	int a = 10;
	printf("a=%d ",a++);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

这里因为是先使用所以a没有自增就被打印了出来。

结合性从右向左

 

4,- -操作符

含义:自减运算符(单目运算符)

分为前置- -和后置- -

前置- -

先- -再使用

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

 

 

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include <stdio.h>
int main()
{
	int a = 10;
	
	printf("a=%d ",--a);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

后置- -

先使用再- -

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

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

#include <stdio.h>
int main()
{
	int a = 10;
	printf("a=%d ",a--);
	return 0;
}

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

这里因为先使用所以a还没有自减就已经被打印

 

5,-符号运算符

含义:负号运算符(单目运算符)

优先级:从右向左

(注意负号运算符和减法运算符不同,负号运算符是单目运算符,减法运算符是双目运算符,系统会自动识别)

#include <stdio.h>
int main()
{
	int a = 10;
	a = -a;//负号运算符
	a = a - 10;//减法运算符
	return 0;
}

 

6,* (指针)操作符

含义:指针运算符(单目运算符)

用来存放地址,或者找到指针变量所指对象。

(具体指针性质在之后提到)

#include <stdio.h>
int main()
{
	int a = 5;
	int* pr = &a;//存放地址
	printf("%d",*pr);//找到指针变量所指对象
	return 0;
}

 

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

结合性:从右向左

 

7,&(取地址)操作符

含义:地址运算符(单目操作符)

结合性:自右向左

通常伴随指针使用不再赘述

 

8,sizeof 操作符

含义:长度运算符(单目操作符)

sizeof可以计算变量大小,也可以计算变量类型大小C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

(注意int[10]是数组的类型)

当求变量大小时sizeof()括号可以省略

但当求到变量类型的大小时括号不可以省略

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

sizeof与strlen的区别

sizeof是操作符求大小,strlen是求字符串长度函数其必须有()函数调用操作符

sizeof会计算\0的大小,而strlen不会计算\0的长度(\0)是字符串结束的标志。

sizeof括号内的表达式是不会执行计算的

eg:

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

 

C语言_干翻操作符_含义+结合性+优先级+例子分析(上)-鸿蒙开发者社区

发现s在sizeof()内却没有计算,sizeof只计算了s类型的大小
(注意这个例子中决定sizeof值的是s的类型不是表达式中a的类型)

不计算的原因是
我们编译的.c文件会经过链接生成.exe可执行文件
而sizeof(s=a+5)在编译过程中就被替换成s类型的大小,所以就相当于s=a+5这个表达式在exe文件中是2,所以不会i执行运算

结合性:从右向左

 

优先级3级(*(乘法),/,%)


1.*(乘法),/,%操作符

*(乘法)操作符 运算不在赘述;

/(除法)操作符
(注意要想通过除法得到一个浮点型,除数与被除数至少有一个要写出小数)

#include <stdio.h>
int main()
{
	float i = 3 / 2.0;
	printf("%f",i);
	return 0;
}

%(求余操作符)
(注意%不能有小数)

通常通过%来控制随机数的范围,
或者得到数字的每一位,
也可以通过%2来得到数字二进制的每一位。

三者结合性:从左向右。

分类
已于2021-2-23 09:31:41修改
收藏
回复
举报
回复
    相关推荐