c语言操作符详解(三)

发布时间:2024年01月20日

本节主要分析赋值操作符,算术操作符,关系操作符,逻辑操作符,逗号表达式,下标引用操作符以及函数调用、结构体调用操作符

赋值操作符

赋值操作符很简单,它的优先级很低,基本在我们常用的操作符的后面。需要知道的是一个表达式是可以连续进行赋值的。比如这么一个表达式:

int a = 10;

int b = 9;

int c = a = b + 5;

这就是一个连续赋值操作,它可以分解成以下操作:a = b + 5; c = a;

算术操作符

算术操作符包括:加减乘除取模( + -? *? / %)

五种操作符的优先级是 * > / > % > + > -

取模运算就是我们常说的求余。小数是不能取模的。只有整数可以取模

关于除法的运算也需要注意。

假如除号两边都是整数,?整除出来的数也会是整数,这里没有发生浮点型提升。但是这里就会有一个丢失数据的问题,比如 5 / 3 ,这个数应该是大于1,而且小于2的。但是它会将小数点的部分直接消去,得出来的是1。造成数据的丢失。(注意,不会采用四舍五入的方式)

假如除号两边有任意一个浮点类型。那么得到的结果也为浮点。因为这里发生了浮点型提升。并且不会丢失数据。

关系操作符

关系操作符有五个: > 、 < 、 == 、 <= 、 >=?

五个运算符的优先级都小于算术操作符。

五个运算符的优先级比较是? >? 、 >= 、? <、 <=、? ==

关系运算符是用来比较符号两边字符的关系的。比如 1 <? 2; 3 > 4; 这种,但是这种比较一定有真有假,所以,关系操作符运算后是有返回值的。 比如 1 < 2 返回值就是1, 3 > 4 返回值就是0;

当有这么一个式子

3 < 2 == 0 的时候,最后结果是什么呢?应该这样计算:<的优先级高于==, 所以先算 3 < 2, 为假则是0, 再算 0 == 0,结果为真,所以最后结果是1, 这个表达式的最后结果就是1.

逻辑操作符

逻辑操作符包括: &&, ||

&&代表并且。意思是只有两边同时为真,表达式才为真。否则为假;||代表或者。意思是只有两边同时为假,表达式才为假,否则为真。

逻辑操作符的优先级是低于关系操作符和算术操作符的。

逻辑操作符的优先级大小是: && > ||

这里主要分析一个短路的问题。

就是在一个表达式中,假如已经能够判断一个表达式的真假。那么逻辑操作符是不再往下计算的。比如下面的例子:
?

在这个例子中,a++已经能判断||左边是真,他整体已经为真了,那么||就不会再执行b--了,同样的,既然a++ || b--已经为真了。第二个||就不会执行++c了。所以在这个式子中,b--和++c都被短路了。没有被执行。只执行了a++;

?

同样的,看这个例子。 --a,先--再使用,则为零。&&直接判断结果为零,短路b++。但是后面的符号是||, 则不能直接短路。需要再看一下c++是否为零。c++是后置加加,先使用再加加。所以4 > 0, 为真.||两边有一个为真就为真。则这个表达式为真。

逗号表达式

?逗号表达式,就是用一连串的逗号来联系的式子,形如:

int a = 4;

int b = 6;

int c = a++, b--, a + b;

赋值符后面的就是逗号表达式,逗号表达式的每个式子都会进行计算,但是进行赋值时,只会取最后一个式子,即a + b。

在上面的这个式子中,c的计算方法是:

先计算a++, a为5; 再计算b--, b为5; 最后 再计算 a + b, 得到10, 赋值给c。则c为10.

函数调用操作符

函数调用操作符(), 是函数调用的标志。例如

这串代码中可以看到,调用Add的时候我们使用了(),可以发现,函数调用操作符,是函数的标志。那么我们回过头来再想sizeof, sizeof是不是可以使用 sizeof 对象,可以不加括号。那么我们就可以知道,sizeof不是一个函数。是一个操作符。

结构体调用操作符

?结构体调用操作符有两个:

. 和->

.主要用来值调用。->主要用来址调用。

对于一个结构体变量,我们可以使用.来找到这个结构体变量的对象。

而对于一个结构体指针,那么我们必须通过->来找到这个指针所指向空间的对象。

例如

下标引用操作符?

下标引用操作符就是数组的那[], 这就是下标引用操作符。

?有:

int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

那么arr[8] = 8, 这里[8]中的8, 就是这个数组的下标。[]是一个操作符。既然是一个操作符。那么这个操作符就有操作数。他的操作数是什么?

这里要知道,[]的操作数就是arr 与 8, 而且这两个数是可以交换的。是满足交换律的。我们说,arr[8] 其实就可以写成指针的形式*(arr + 8), 既然满足交换律, 那么就有:

*( arr + 8 ) == *( 8 + arr ) == 8[arr] == arr[8]; 可以知道,8[arr] 也是正确的写法。但这种写法只限于非定义阶段,就是当我要定义arr数组的时候我不可以写成

int 10[arr] ,这样就是错误的。但是我们在之后使用的时候,由于其具有交换律,我们就可以写成

8[arr] 的形式。

文章来源:https://blog.csdn.net/strive_mianyang/article/details/135671940
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。