C语言之操作符【下】

在上一节中,我们已经学习了操作符的一些相关知识,我们对C语言的操作符有了新的认识与理解,那么在本节C语言中,我们将继续上一次的讲解,为大家呈现更加有趣并且深刻的讲解,来开启我们的操作符之旅吧!

一.下标访问[],函数调用()

1.下标访问[]

1.什么是下标访问[]

1.在C语言学习中,我们会经常用到下标访问操作符,那么相信在屏幕前的你们一定很想知道什么是下标访问操作符吧?下面我就为大家详细的道来:其实下标访问操作符,是数组里面的一个知识点,下标访问操作符是数组遍历当中经常使用的,数组在遍历[]里面会有一些数字,而那些数字其实就可以表示数组的内容,因此就可以对数组进行遍历了。 2.形式是[]里面的数字从数字0开始,到最后的数字结束。

2.下标访问操作符[]的应用与举例

1.下标访问操作符的应用:下标访问操作符,应用到数组当中,对于数组内容的访问有着极其重要的意义。 2.下标访问操作符的举例:如在下面的函数当中,我们就用到了下标访问操作符。

#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
for(int i=0; i<5;i++)
printf("%d",a[i]);
return 0;
}

3.在上例当中,a[i]里面的i其实就是数组里面的内容,它的意思是说数组里面的的i-1个元素,因此我们通过这个方法对其进行遍历。

2.函数调用()

1.函数调用操作符是小括号。 2.形式如下:

int add(int x,int y);

在上例之中,小括号之前的是,函数名;在小括号之后的是形参,可以看出该函数有两个形参:一个是int x,另一个是int y,该函数的返回类型是int形。

二.操作符的属性:优先级、结合性

1.优先级

1.每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。 2.操作符的优先级如下: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

2.结合性

结合性是,对于多个优先级是一样的操作符的一个表达式,此时他们的就需要用到,结合性,如下:

2*3/5

此时他们的优先级是一样的,因此我们选择使用结合性,因为,乘法和除法的结合性是做结合的因此该表达式是从左到右计算的。

3.俩者之间的应用

因为在上文的优先级表格中,小括号的优先级是最高的,使用小括号可以提高算术的优先级。因此呢,当有一些表达式的优先级是一样的时候,我们就可以使用小括号,这样小括号括起来的地方,优先级是比较高的,可以达到我们想要的结果

三.整型提升

1.整型提升

C语言中整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

2.整形提升的意义

整型提升的意义是在表达式中,各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算12。C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。比如:即使两个char类型(1个字节==8个比特字节)的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度.

3.如何进行整型提升

  1. 有符号整数提升是按照变量的数据类型的符号位来提升的

  2. 无符号整数提升,高位补0

例子如下:

int main()
{

char - signed char
unsigned char
char a = 5;//char只有一个字节,那么的话char有8个比特位。
//a 的二进制位是:00000101 - a (截断后存储a中)
//由于a是无符号类型的,可以整型提升,提升为int类型,以二进制位表示如下:000000000000000000000000 00000101
	char b = 127;
//类似char a,一些步骤缺省,因此将他转换为int类型以二进制表示如下:00000000000000000000000001111111
01111111 - b (截断后存储到b中)

	char c = a + b;//发生整型提升
00000000000000000000000000000101 - a
00000000000000000000000001111111 - b
00000000000000000000000010000100 - a+b
10000100 - c//由于char c的最高位是1因此我们用1char c提升为整形,如下:
printf("%d\n", c);
//这里c还是要整型提升
11111111111111111111111110000100//c的整型提升的原码
10000000000000000000000001111011//c的反码
10000000000000000000000001111100//c的补码
-124
%d 是按照10进制的形式打印有符号的整数
	return 0;
	}

四.算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换:

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名靠后,那么首先要转换为另外一个操作数的类型后执行运算。

五.表达式求值

下面是一些,对操作符运用不太正确的例子:


int main()
{
	int c = 3 + 4 * 5;
//这里由于乘法的优先级是比较高的,因此只有一种计算方式,先算乘法,再算加法,也就是说答案是23.
	return 0;
}


#include <stdio.h>
int fun()
{
	static int count = 1;
	return ++count;
}
int main()
{
	int answer;
	answer = fun() - fun() * fun();//在该函数之中,虽然乘法是优先级是较高的,但是我们却不知道这个表达式先调用的是哪一个,因此可能用不止一个答案。
//如果是1.fun()-2.fun()*3.fun(),那么的话答案就是-10
//要是3.fun()-1,fun()*2.fun(),那么的话答案就是-2,这些表达式,是不正确的表达式,下面我就为大家继续讲解更多的这种不正确的表达式。

	printf("%d\n", answer); //输出多少?
	return 0;
}

#include <stdio.h>
int main()
{
	int i = 1;
	int ret = (++i) + (++i) + (++i);
//这种表达式,要是我在vs上运行的话那么结果是12,要是在gcc上运行的话,结果就是10
//首先说一下vs的情况吧,在vs上面是先算++i,最后在算加法,因此结果就是4+4+4=12.
//然后我们再说一下,在gcc上运行的结果,在gcc上是开始先算++i,再开始算++i,然后算加法,然后++i,然后算加法,答案也就是:3+3+4=10
	printf("%d\n", ret);
	printf("%d\n", i);
	return 0;
}

写到最后,因此我们平常在写C语言的时候,应当极其谨慎并且小心,尽量不使用,长语句表达式,我们可以将长语句表达式分为多次短语句表达式,虽然这样会比较的麻烦但是,这样做在我们以后工作的时候,起到极其重要的作用,对团队协作有较大的帮助。 结束(完)。