c语言中条件运算 结合方向 从右到左 什么意思

RT 看的时候不是从左往右看的么

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


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

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:虽然计算结果相同,但是计算的顺序是完全不同的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-25
在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。 但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式: int a,b=1,c=2; a=b=c; 我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
第2个回答  2013-06-25
在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式a*b+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法a*b,而不是加法b+c。 但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式: int a,b=1,c=2; a=b=c; 我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。 所有的赋值符(包括复合赋值)都具有右结合性,就是说在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2.类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
第3个回答  2015-05-15
从左到右扫描,从右往左计算。 比如一个赋值语句,a=b;首先从b地址取数据,然后写到a地址。所以是从右到左计算。
第4个回答  2013-06-25
从左到右扫描,从右往左计算。 比如一个赋值语句,a=b;首先从b地址取数据,然后写到a地址。所以是从右到左计算。

c语言中条件运算 结合方向 从右到左 什么意思
运算符的结合方向(顺序)决定了计算的顺序。条件运算符(? :)的结合方向是从右到左,也即运算符的匹配顺序是从右往左的。下面举例说明结合顺序从右到左的含义:int a=1, b=3, c=2, d;d = a>b ? a : c>b ? c : b; \/\/ 根据从右到左的结合顺序,则该表达式等价于d = (a>b ? ...

C语言中条件预算符的结合方向如何?
条件运算符(?:)这个表达式,它的结合是右结合式的。就是说自右向左运算。这个是硬性的规定,没有为什么。它属于三目运算符,对第一个表达式作真、假判断,然后根据结果返回另外两个表达式其中的一个的值。<表达式1>?<表达式2>:<表达式3> 在运算中,首先对第一个表达式进行判断,如果为真,则返回...

c语言中运算符的结合方向什么时候从左至右,什么时候从右至左
左结合性:自左至右。右结合性:自右至左。一个运算量两侧的运算符优先级相同时,按运算符的结合性所规定的结合方向处理。C语言中各运算符的结合性分为两种,即左结合性和右结合性。如,算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后...

C语言中结合方向自右向左的问题
这和参数的入栈顺序有关,C语言的函数参数的入栈顺序是自右向左,这主要是为了支持参数数量可变的函数,也就是(*q)++先入栈,然后*p才入栈,所以先计算表达式(*q)++,因此结果是3,2。还有即使按你的思路,先计算*p,那结果也应该是2,2 ...

c语言的结合方向怎么理解?我新手,请高手说的通俗一点儿
通俗点,就是运算顺序。左结合就是从左向右运算,右结合就是从右向左运算。其实和算术运算的加减乘除乘方啥的差不多,只是多了一些其他的运算符,比如大于小于号啊,判等(==)不等(!=)之类的。

...级的表看得不是很明白,有的从左往右,有的从右往左
运算符涉及到优先级和结合性问题,”从左往右“和”从右往左“说的是运算符的结合性。优先级决定表达式中各种不同的运算符起作用的优先次序,而结合性则在相邻的运算符的具有同等优先级时,决定表达式的结合方向。可以这样理解:首先,表达式中得有多个运算符,这样就存在左右两边都有运算符的操作数:1...

条件运算符的结合方向是“自左向右”对么?
条件运算符的结合方向是“自左向右”是错的。还有自右至左的。C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z则 y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左...

c语言中运算符的“结合方向”到底是怎么回事啊!
一般编译器是把表达式由中缀形式(即一般形式)根据优先级转换为后缀形式,如3+2*5转换为2 5 * 3 +,然后再从左到右运算

c语言中的? :怎么用啊
你好,朋友!C语言中的“?:”是条件运算符,它是三目运算符,它的结合方向是自右至左。条件表达式的一般形式是 表达式1?表达式2:表达式3 说明:条件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解...

C语言中的 条件运算符的结合方向是自右到左吗?
? : 条件运算符的结合方向是自左至右 只有以下的赋值运算符和单目运算符的结合方法是自右至左:! 逻辑非运算符 ~ 按位取反运算符 ++ 自增运算符 -- 自减运算符 - 负号运算符 (类型) 类型转换运算符 指针运算符 & 地址与运算符 sizeof 长度运算符 赋值运算符= ...

相似回答