关键:
简单例题:
难度例题:
无论多么复杂的++组合运算,其实语法逻辑都很简单,都是:从左往右的函数调用和加法计算。
递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。
注意:
递增运算符和递减运算符只能影响一个变量(或者说只能影响一个可修改的左值)(详见C Primer Plus P118) 在C语言中,编译器可以自行选择先对函数中的哪一个参数求值,这样做提高了编译器的效率,但是如果在函数的参数里使用了递增运算符会产生一些问题
问题分析:
ans = num/2 + 5*(1 + num++)
我们可能认为先计算num/2
,接着计算5*(1 + num++)
,但是编译器可能先计算第二项,递增num,然后再计算num/2
时结果可能偏大。
结果可能会有多种情况,准确的说,结果是未定义的,这意味着C标准并未定义结果是什么。
如何避免这种问题的产生:
遵循以下规则(详见C Primer Plus)
如果一个变量出现在一个函数的多个参数里,不要对该变量使用递增或者递减运算符。 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或者递减运算符。
PS:
对于第二条规则适用于复杂的多项运算包括了加减乘除,如上面的问题例题。但是如果复杂运算中只包含了递增或者递减运算,如上面的复杂的递增运算符组合运算多个例题,只有++运算则可以依据上面的++的原理进行分析和解题,可以正常计算。