Java使用一元运算符--时触发Unexpected Type Error相关问题咨询
问题解答
1. 为什么赋值-3可正常执行,--3就报错?
-是一元负号运算符,仅需要对操作数的值做计算,字面值3本身是合法的数值,所以-3可以正常求值。
而--是前置自减运算符,属于赋值类运算符,要求操作数必须是可修改的变量(左值),执行时需要修改操作数的存储值。字面值3是固定常量,没有可写入的存储空间,不满足自减运算符的操作数要求,因此直接报错。你课上听到的--3求值为3的规则不属于Java语法,是其他编程语言的特性。
2. 是否存在--expr被判定为双重否定而非自减运算符的场景?
不存在。Java词法解析遵循最长匹配原则,连续出现的符号会优先组合成长度最长的合法运算符,两个连续的-会被优先识别为自减运算符--,不会拆分为两个独立的一元负号。如果需要实现双重否定,必须在两个负号之间加空格,写成- -expr,例如int a = - -3;会被解析为两次取负,最终结果为3。
3. 为什么抛出Unexpected Type Error的位置不能直接传入字面值?
自增++、自减--运算符的本质是:先对操作数做加减1计算,再把计算结果写回原操作数。这就要求操作数必须有可写的内存地址,也就是可以被赋值的变量(左值)。字面值属于右值,仅代表固定数值,没有对应的可写内存空间,无法完成写回操作,因此编译器会报错提示“需要变量,实际传入的是值”。
4. Java是如何对d---t求值的?具体求值顺序是什么?
你的原有推理不正确,该表达式的解析仍然遵循最长匹配原则,会被拆分为(d--) - t,而非你认为的d - (-(-t)),实际求值顺序如下:
- 读取
d的当前值(执行该表达式前d=9),作为后缀自减表达式d--的返回值 - 将
d的值自减1,更新为8 - 读取
t的当前值(执行该表达式前t=9) - 用第一步得到的d的旧值9减去t的值9,得到最终结果0赋值给f
你可以在执行完该表达式后打印d的值验证,此时d的取值为8,即可证明自减操作实际作用在了d上,而非对t做多次取负。
内容的提问来源于stack exchange,提问作者Tech320
相关产品推荐
相关产品推荐

