c语言中运算符的结合方向什么时候从左至右,什么时候从右至左

Python013

c语言中运算符的结合方向什么时候从左至右,什么时候从右至左,第1张

左结合性:自左至右。

右结合性:自右至左。

一个运算量两侧的运算符优先级相同时,按运算符的结合性所规定的结合方向处理。C语言中各运算符的结合性分为两种,即左结合性和右结合性。

如,算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执行+z的运算。

而最典型的右结合性运算符是赋值运算符,如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。

扩展资料

C语言中的运算符

(1)算术运算符(+,-,*,/,%,++,--)。

(2) 关系运算符(<, >, <=, >=, ==, ![KG-*8]=) 。

(3) 逻辑运算符(!, &&, ||) 。

(4) 位运算符(<<, >>, ~, |, ^, &) 。

(5)赋值运算符(=,及其双目运算符的扩展赋值运算符)。

(6)条件运算符(?:)。

(7)逗号运算符(,)。

(8) 指针运算符(*, &) 。

(9)求字节数运算符(sizeof)。

(10)强制类型转换运算符((类型))。

(11) 分量运算符(·, ->) 。

(12)下标运算符([])。

(13)圆括号运算符(())。

运算符的结合方向(顺序)决定了计算的顺序。条件运算符(? :)的结合方向是从右到左,也即运算符的匹配顺序是从右往左的。

下面举例说明结合顺序从右到左的含义:

int a=1, b=3, c=2, d

d = a>b ? a : c>b ? c : b 

// 根据从右到左的结合顺序,则该表达式等价于d = (a>b ? a : (c>b ? c : b))

// 计算过程:

// 1、先算a>b,结果为0

// 2、再算(c>b ? c : b),之后算c>b,结果为0,

// 3、所以最后结果为b的值,也即等于3

// 如果是从左到右的结合顺序,那么该表达式等价于d =((a>b ? a : c>b) ? c : b)

//计算过程:

// 1、先算a>b,结果为0;

// 2、再算c>b,结果为0;

// 3、所以d=b,结果为b的值,也即等于3

ps:虽然计算结果相同,但是计算的顺序是完全不同的。

C语言函数参数入栈顺序从右到左是为了方便可变参数函数。

一、在函数调用时,函数参数的传递,在C语言中是通过栈数据结构实现的。

在调用函数时,先根据调用函数使用的参数,自右向左依次压入栈中,然后调用函数,在函数开始执行时,将参数再依次弹栈。根据栈数据结构先进后出的特点,在函数中弹栈的顺序就是从左向右的。

二、对于参数固定的函数,无论是从左向右还是从右向左,都没什么区别,最终都是所有参数全部传递。

三、对于可变参数,比如printf,会在第一个参数格式字符串中,指明后续有几个参数,各自是什么类型的。于是在函数中,参数格式字符串必须第一个弹栈,否则无法获取参数类型,也就无法获知后续参数占几个字节,导致无法正确获知参数。

四、理论上来说,如果从左向右压栈,可变参数标记格式字符串的参数放在最后,那么也是可以的。 不过最早设计C语言的人采用了这种方式,后续也就延续下来了。