C语言中 怎样理解三目运算符(条件运算符)的右结合性?对于表达式 --a == b++ a++ :b++当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式.但是它的又结合性体系那在哪里呢?还有一
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/21 20:00:41
![C语言中 怎样理解三目运算符(条件运算符)的右结合性?对于表达式 --a == b++ a++ :b++当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式.但是它的又结合性体系那在哪里呢?还有一](/uploads/image/z/88581-21-1.jpg?t=C%E8%AF%AD%E8%A8%80%E4%B8%AD+%E6%80%8E%E6%A0%B7%E7%90%86%E8%A7%A3%E4%B8%89%E7%9B%AE%E8%BF%90%E7%AE%97%E7%AC%A6%EF%BC%88%E6%9D%A1%E4%BB%B6%E8%BF%90%E7%AE%97%E7%AC%A6%EF%BC%89%E7%9A%84%E5%8F%B3%E7%BB%93%E5%90%88%E6%80%A7%3F%E5%AF%B9%E4%BA%8E%E8%A1%A8%E8%BE%BE%E5%BC%8F+--a+%3D%3D+b%2B%2B+a%2B%2B+%3Ab%2B%2B%E5%BD%93%E7%84%B6%E6%98%AF%E5%85%88%E5%88%A4%E6%96%AD--a+%E6%98%AF%E5%90%A6%E7%AD%89%E4%BA%8E+b%2B%2B+%2C%E7%84%B6%E5%90%8E%E5%86%B3%E5%AE%9A%E6%89%A7%E8%A1%8C%E5%90%8E%E9%9D%A2%E7%9A%84%E5%93%AA%E4%B8%AA%E8%A1%A8%E8%BE%BE%E5%BC%8F.%E4%BD%86%E6%98%AF%E5%AE%83%E7%9A%84%E5%8F%88%E7%BB%93%E5%90%88%E6%80%A7%E4%BD%93%E7%B3%BB%E9%82%A3%E5%9C%A8%E5%93%AA%E9%87%8C%E5%91%A2%3F%E8%BF%98%E6%9C%89%E4%B8%80)
C语言中 怎样理解三目运算符(条件运算符)的右结合性?对于表达式 --a == b++ a++ :b++当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式.但是它的又结合性体系那在哪里呢?还有一
C语言中 怎样理解三目运算符(条件运算符)的右结合性?
对于表达式 --a == b++ a++ :b++
当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式.但是它的又结合性体系那在哪里呢?
还有一个问题:为什么不把这个表达式中所有的自加自减运算先执行完,然后再执行条件判断呢?
C语言中 怎样理解三目运算符(条件运算符)的右结合性?对于表达式 --a == b++ a++ :b++当然是先判断--a 是否等于 b++ ,然后决定执行后面的哪个表达式.但是它的又结合性体系那在哪里呢?还有一
这里涉及了C中的优先级、结合性、求值顺序.
结合性只有在相同优先级的运算符间才起作用,比如a+b*c,+与*优先级不同,这里根本不用去管结合性.而a+b+c则需要进行结合性考虑了,如果+为左结合性,那么应该理解为:(a+b)+c,如果+为右结合性,那么应该理解为a+(b+c),当然了,我们已经知道+为左结合性了.
对于?:,在C中与它优先级相同的只有它自己,因此只有连续的?:才会体现出它的右结合性,即a?b:d:e中,根据右结合性可知应理解为a?b:(c?d:e).显然,上述问题中是体现不出这种结合性来的.
再者,还有一个求值顺序的问题,b:c中,C语言规定先对a求值,非零则对b求值并作为该表达式的值,为零则对c求值并作为表达式的值,并且b和c中有且仅有一个会被求值.对于题目中的就应该是:先进行(--a == b++)的求值,根据是否为零,会对(a++)或(b++)进行求值.说白了,也就是只有两种可能性:可能性1:先算(--a == b++),再算(a++);可能性2:先算(--a == b++),再算(b++).至于(--a == b++)中到底是先算--a 还是b++则仅从C语言这个角度是无法判别的,这是个实现问题,如果要想写出健壮的可移植的代码就应该避免这种表述.
总结一下,就是先看优先级,次看结合性,有的求值有序,有的则无序.