Java中参数执行顺序的保证是什么?

78

C中给定以下函数调用:

fooFunc( barFunc(), bazFunc() );

barFunc()BazFunc()的执行顺序没有指定,因此在C中可能会在调用bazFunc()之前调用barFunc()或在调用barFunc()之前调用bazFunc()

Java是否指定函数参数表达式的执行顺序,像C一样是未指定的?


1个回答

88

来自Java语言规范(关于表达式):

15.7.4 参数列表从左到右求值

在方法或构造函数调用或类实例创建表达式中, 参数表达式可以出现在括号内,由逗号分隔。 在任何参数表达式的任何右侧部分之前, 每个参数表达式似乎都被完全求值。


注:该翻译保留原文中的HTML标签。此处对Java语言规范中关于表达式的描述进行了翻译,其中指出,在方法调用、构造函数调用或类实例创建表达式中,参数表达式将从左到右依次求值,每个参数表达式都会在其右侧的任何部分之前被完全求值。

10
虽然这是正确的,但请不要编写依赖于执行顺序的代码。这样只会增加复杂性,而没有增加功能。 - Jon
8
确实,“建议代码不要在重要方面依赖于这个规范。” http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7 - trashgod
54
@Jon 我不同意!如果规范中有这个要求,那么你可以依赖它。比如说,要从一个文件中读取一个矩形,我使用这段代码:myRect = new Rectangle(scan.nextInt(), scan.nextInt(), scan.nextInt(), scan.nextInt()); 这样简洁明了。使用更长的实现反而会增加不必要的复杂度。 - John Henckel
5
我用这个方法来避免在许多地方保存本地变量,使得解析器中每个函数调用的代码缩短了1/2行 :D。除非这样做会创建更复杂的代码,通常避免使用许多本地变量是良好的设计。 - CoffeDeveloper
7
如果Java允许在构造函数的连续调用之前声明临时变量,我会同意您的观点。然而,当将构造函数连锁调用与复杂成员初始化相结合时,我看不到可靠的替代方案来依赖这种行为。 - Jeff G
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接