我正在阅读" Java编程Deitel& Deitel第7版"我看到了运营商的优先权,但我有点担心。
作者说当有一个数学典型的表达式,其中有相同优先级的运算符从左到右运行。例如:
System.out.println (a + b + c - d);
从这个意义上讲,操作是从左到右执行,然后我在互联网上进行研究,我发现" ="操作员从右到左运行。例如:
int x;
x = 4 * 4 * 4% 2;
所有的税都很好,直到我ponogo进一步调查并编写代码,它发生在我身上,我写了这个例子:
System.out.println ((4 * 4) + (8 * 8) * (4 * 4) - 16/4);
我的问题是,如果书中说加法和减法与其他算子相比具有较低的优先级,如果我将典型表达式的值相加,该怎么办?让我解释一下:
当我放(4 * 4) + (8 * 8) * (4 * 4)
时我会添加乘法的值,然后降低运算符的优先级?
另一个问题:
如果我有一个例子如下:
System.out.println (a * b * c + d + e + f * g / h);
高优先级操作从左到右按顺序执行,当我有时间运行更高的优先级时它是否也从左向右运行?
当赋值变量的值时,具有较高优先级的运算符是从右到左关联的吗?
答案 0 :(得分:1)
我会尝试用一些引用来回答这个问题,这样你就可以进入你想要的任何深度。什么让你感到困惑并不完全清楚。
首先,您需要清楚示例中的赋值运算符(=
之间的差异,但这些运算符还包括例如+=
等)和其他(二进制)运算符(例如+
},-
,*
,%
等)。赋值运算符(例如=
)从右到左进行求值 - 即它们计算出运算符右边所有内容的值,然后将它分配给左边的任何内容。
对于其他运营商,他们首先应用运营商优先级,然后然后对具有相同优先级的运营商应用从左到右的操作。 the official tutorial中提供了一个优先级表并对此进行了讨论。它与您正在使用的书的第1509页上的表(图A.1)非常相似,但Web教程解释可能更容易理解。它可以概括为首先应用括号中的表达式的优先级,然后是后缀然后是一元运算符(例如x++
,然后是-x
),然后是乘法运算符(*
,{{1 }},\
)然后加法(%
,+
),最后是许多与此问题不直接相关的逻辑运算符。
最后,本教程包含语句
当具有相同优先级的运算符出现在同一表达式中时,规则必须控制首先计算的值。除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左进行计算。
至关重要的是,优先从左到右的评估将重复进行,最容易通过逐步完成示例来说明:
-
表达式评估的权威性规范在Java Language Specification chapter 15中。在这个级别上它可能比有用更令人困惑,但我将其包含在内以便完整。 Section 15.7.3处理关于表达式和运算符优先级的括号(parantheses)。
答案 1 :(得分:0)
通常,代码始终从左到右读取,但也遵循数学优先级。例如:
(4 * 4) + (8 * 8) * (4 * 4) - 16/4
数学在这种情况下说:首先是括号,然后是乘法和除法,然后是加法和减法。然后:
//Parenthesis done
(16) + (64) * (16) - 16/4
//Multiplication and division done
16 + 1024 - 4
//Addition and subtraction done
1036