今天突然想到这个问题,试了一下果然不行。 有大佬知道这是为什么吗?或者这是哪方面的知识啊?
public class Test {
public static void main(String[] args){
Test t=new Test();
t.isGoodlooking()?kissMe():fuckOff();
}
boolean isGoodlooking(){
return true;
}
static void kissMe(){
System.out.println("Kiss me");
}
static void fuckOff(){
System.out.println("Fuck off");
}
}
第五行报错
not a statement
1
hcymk2 2019-05-26 18:43:31 +08:00 via Android
没有返回值啊。
|
2
tomoya92 2019-05-26 18:47:08 +08:00 via iPhone
静态方法应该用类名调用吧
|
3
geelaw 2019-05-26 18:48:52 +08:00 via iPhone 2
有些语言要求只有(属性 /事件 /索引器 /字段 /变量 /参数)(复合)赋值 /自增 /自减、方法调用、构造器调用、await、这些表达式才能成为语句,而其他表达式不能做语句(还有其他不是表达式语句的语句构造,略去)。
例如 new ClassName(); 是一个语句,但 (new ClassName()) 不是一个语句。 C/C++ 无此限制,C# 有此限制,看来 Java 也有。 |
4
sudri 2019-05-26 19:00:55 +08:00
需要有返回值才行
String result = t.isGoodlooking() ? kissMe() : fuckOff(); static String kissMe() { System.out.println("Kiss me"); return ""; } static String fuckOff() { System.out.println("Fuck off"); return ""; } |
5
geelaw 2019-05-26 19:09:23 +08:00 via iPhone
@hcymk2 #1
@sudri #4 并不是那个原因(或者应该说这不是第一个原因),这里出现的是一个句法错误而不是一个语义错误,当然返回 void 的方法调用表达式不能作为另一个表达式的一部分,这会造成语义错误。 #4 的代码能编译是要谢谢那里结果作为另一个变量的初始化表达式,如果你删除 String result =,依然不能编译成功。 @tomoya92 #2 并不是那个原因。 https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.8 这里明确表示只有赋值、自增自减、方法调用和对象创建表达式可以成为表达式语句,而 ?: 表达式不是上述类型,故增加一个分号后不能成为语句。 |
7
MonoLogueChi 2019-05-26 21:44:16 +08:00
需要限定一下语言,C#是可以的
```cs using System; internal class Program { private static void Main(string[] args) { Program p = new Program(); int a = true ? p.A() : p.B(); Console.ReadKey(); } private int A() { Console.WriteLine("A"); return 0; } private int B() { Console.WriteLine("B"); return 0; } } ``` 输出是 ``` A ``` 做了一下测试,函数返回 void 类型不行,必须有赋值给其他变量,比如直接写 `true ? p.A() : p.B();` 不行,方法是不是静态的都可以。 |
8
KasuganoSoras 2019-05-26 22:33:02 +08:00
PHP 可以
<?php function a() { return true; } function b() { echo "Is true"; } function c() { echo "Is false;"; } a() ? b() : c(); Output: Is true |
9
abigboy OP @sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~😎
|
10
mario85 2019-05-27 00:49:09 +08:00 via iPhone
|
12
tomoya92 2019-05-27 08:19:33 +08:00
@hcymk2 @abigboy 确实加个返回值就可以了
```java public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t.isGoodlooking() ? kissMe() : fuckOff()); } boolean isGoodlooking() { return true; } static String kissMe() { return "Kiss me"; } static String fuckOff() { return "Fuck off"; } } ``` |