关于实参表计算方向的问题
我听别人说实参表计算方向自右向左,即
int fun(int a,int b)
{……}
调用fun
fun (i,++i)
如果i=2,
因实参表自右向左计算,先++i,再i
即a=3,b=3
对吗?
谢偃
浏览 1523 回答 3
3回答
onemoo
不对。C++标准没有规定参数的求值顺序,也就是这是所谓的“未定义行为”,不要写依赖这种行为的代码。不仅是函数参数,其实很多运算符的操作数也没有规定求值顺序,所以一般对于写复合表达式有一个建议:如果表达式改变了一个操作数的值,那就不要在这个复合表达式中再次使用这个操作数。除非你能确定“改变值”和“读取值”的先后顺序。尤其是对于自增/自减这种有副作用的表达式来说,在你不确定时顺序时,不要多次使用其操作数的值。如果你曾听说过关于参数的什么“顺序”的话,那可能是这个:函数参数传参/压栈顺序是有相应规定的,这包含在“调用约定”中。实际上有多种调用约定,有的规定从右向左压栈、有的是从左向右压栈... 绝大多数使用的cdecl约定是从右向左压栈。 这和参数的求值顺序完全没有关系。另外如果你还不知道“压栈”是什么东西的话,就别管这个了。
慕的地8582982
TKAFICQATDXCZPROLBVECMBUXVBVOVIVITZCZCVVSRSIRHXKXBKRUICICCPSGYPLICXNRKXIYVFPXIVWZKNSSZWTHDDQTAQZTSQQWWZMDLRNEIUTUXRROKXUBTFYGJWVLIQYOKTWTSVYVPOSPFUKHXGIMPPFBXZILBRBKQLUKHKTKTWMSVFTXGWSBRBFIRBQTDMOEBZVFCSVKAWFIUXZQMCSNKNQMIYUEOWMUEUFBEBYOKTVMPMVTWFOLHQAWBXTUQAJMIFOQTCMIKMIFDTIEADAXHXMVYWRMXTCZCXHLEOQNCSIRTDYVZBFUQAUDALXSIFVXURNQAZURNKZWGPLVWZTKSVEFRELJRHEZRULBJGNDGWNDGJLIYRNCFPFAQZJZUENKAJSCENQBRMPLWSBCSDNBKRUEDKXAYNJSCYORURNEQNKTJMILBXNMVEHXTJZOLTVXMCLHKMGDADKGGKKTGWFEPRAQFCEZVEHZVRBRBWSOYVZWLCLUKAJSDMPZVFPSUPLIGCRFCZISOEHYPLBYVRAJZCTEAXTQSUTDTXNURORNQGQAIRARHCYZIFCZVENCFGJSPFDTVRHDZAWSBRHLAQFPQMCSYFVYBETKGKNHJURGCTPLOYZBDAJFOKMJSIFVLAQYUDAOUJLVKGCSAXAJSODTVRAWSCXGJYOQGWSURXTNJSBXMVEBMPYVLNKZVMIKNPLUEHQSGPZVQTWZBLHDSTPEHEUEAPYIIYUQNQYHDFCYTPLNDTPRUQLAPGVYUWSQFDYUYHRNJYUQISHXTVROBEAJYHQMWFVXNJVXNWSJLIRGXIETPEHWSUXHKODTCYSVEGRNWYUILORTQGPXAQSQMOENRPRUXSCSQFBDYGJSURGWFIF
angie
不知道你有没有实际运行代码试一下对于 fun(i, ++i) 这种写法是一种未定义的行为(C标准未定义),编译器厂商可以根据自己的理解进行定义这种行为(比如使用 clang 就会警告你 unsequenced modification and access to i)。因此这是不推荐的写法,因为使用不用的编译器可能产生不同的结果。对于实参表,确实是从右往左的,因为函数调用会有一个入栈的过程。但对于 a == 3 和 b == 3这个结果,不一定是正确的
打开App,查看更多内容