Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java操作符总是从左到右读取吗?_Java_Operators - Fatal编程技术网

Java操作符总是从左到右读取吗?

Java操作符总是从左到右读取吗?,java,operators,Java,Operators,假设我们有这样一个代码: int k=1; System.out.println(k++ * ++k); 输出是三,这就是我的问题。Java是否总是这样,而不是首先读取整行并将前指令与后指令分开,从而将其视为: int k=1; k+=1; System.out.println(k*k); k+=1; …只是从左到右读?或者它依赖于编译器,不应该依赖于它?这是由语言规范逐运算符定义的。在第一个示例中,*运算符的规则定义如下: 乘法运算符具有相同的优先级,并且在语法上是左结合的(它们从左向右分

假设我们有这样一个代码:

int k=1;
System.out.println(k++ * ++k);
输出是三,这就是我的问题。Java是否总是这样,而不是首先读取整行并将前指令与后指令分开,从而将其视为:

int k=1;
k+=1;
System.out.println(k*k);
k+=1;

…只是从左到右读?或者它依赖于编译器,不应该依赖于它?

这是由语言规范逐运算符定义的。在第一个示例中,
*
运算符的规则定义如下:

乘法运算符具有相同的优先级,并且在语法上是左结合的(它们从左向右分组)


这是由语言规范逐运算符定义的。在第一个示例中,
*
运算符的规则定义如下:

乘法运算符具有相同的优先级,并且在语法上是左结合的(它们从左向右分组)

从左到右求值

说明:

  • k++
    :首先使用k的原始值(即1)
  • 然后增加k,现在k是2
  • ++k
    :先增加k,然后使用。所以k现在是3
当k的初始值为1时,
k++*++k
变为:
1*3
,结果为3

注意,子表达式的副作用在Java中定义良好,这使得该表达式在Java中有效。一个表达式如代码> k++*+k/c>会导致C或C++中的未定义行为。因此,一般避免此类表达;)

从左到右求值

说明:

  • k++
    :首先使用k的原始值(即1)
  • 然后增加k,现在k是2
  • ++k
    :先增加k,然后使用。所以k现在是3
当k的初始值为1时,
k++*++k
变为:
1*3
,结果为3



注意,子表达式的副作用在Java中定义良好,这使得该表达式在Java中有效。一个表达式如代码> k++*+k/c>会导致C或C++中的未定义行为。因此,一般避免此类表达;)

这取决于操作员类型。为什么你认为这与JVM有关,而不是与Java C有关?乘法和除法优先(当括号中没有使用时)。马特·鲍尔-我是个新手,这是我的假设,如果这是错误的,很抱歉,谢谢你的澄清:)你应该看看。它们总是这样计算的,因为一元运算符和后缀运算符的优先级高于乘法。这取决于运算符类型。为什么您认为这与JVM有关,而与javac无关?乘法和除法优先(当不在括号中使用时)马特·鲍尔-我是一个新手,这是我的假设,如果这是错误的,很抱歉,谢谢你的澄清:)你应该看看。它们总是这样计算,因为一元运算符和后缀运算符的优先级高于乘法。谢谢。但是,没有**k或//k,只有++k和--k,那么哪个操作符会使它以从左到右以外的其他方式工作?@Straightfw它都在JLS中。示例:是右关联的。不是开玩笑:我所做的只是在
k++*++k
中搜索
right associative
@strighfw,首先计算
k++
(因为它在左边),它返回1,然后计算
++k
,它返回3,然后将2相乘。谢谢。但是,没有**k或//k,只有++k和--k,那么哪个操作符会使它以从左到右以外的其他方式工作?@Straightfw它都在JLS中。示例:是右关联的。不是开玩笑:我所做的只是在
k++*++k
中搜索
right associative
@strighfw,首先计算
k++
(因为它在左边),它返回1,然后计算
++k
,它返回3,然后乘以2。我了解它的计算方式,我就是不明白为什么它不先读整行,然后做预处理,然后计算,然后做文章:“无论如何谢谢你。”由于左键的“代码> */Cuth>”的左关联性被评估,@蓝精灵为什么它是C或C++中的未定义行为?@ IAMCREASY C和C++语言规范说:如果一个对象被修改不止一次而没有中间的序列点,它是未定义的。我理解它是如何计算的,我只是不明白为什么它不先读整行,然后先做预处理,然后计算,然后做文章:“无论如何谢谢。它是左到右的,因为代码的** */Cuth>的左关联性。@蓝精灵为什么它是C或C++中的未定义行为?”@ IAMCREASY C和C++语言规范说:如果一个对象被修改不止一次而没有中间的序列点,它是未定义的。
k++ * ++k