V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abigboy
V2EX  ›  编程

三元运算符可以用于调用方法吗?

  •  
  •   abigboy · 2019-05-26 18:14:05 +08:00 · 5415 次点击
    这是一个创建于 2000 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天突然想到这个问题,试了一下果然不行。 有大佬知道这是为什么吗?或者这是哪方面的知识啊?

    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

    13 条回复    2019-05-27 16:16:47 +08:00
    hcymk2
        1
    hcymk2  
       2019-05-26 18:43:31 +08:00 via Android
    没有返回值啊。
    tomoya92
        2
    tomoya92  
       2019-05-26 18:47:08 +08:00 via iPhone
    静态方法应该用类名调用吧
    geelaw
        3
    geelaw  
       2019-05-26 18:48:52 +08:00 via iPhone   ❤️ 2
    有些语言要求只有(属性 /事件 /索引器 /字段 /变量 /参数)(复合)赋值 /自增 /自减、方法调用、构造器调用、await、这些表达式才能成为语句,而其他表达式不能做语句(还有其他不是表达式语句的语句构造,略去)。

    例如 new ClassName(); 是一个语句,但 (new ClassName()) 不是一个语句。

    C/C++ 无此限制,C# 有此限制,看来 Java 也有。
    sudri
        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 "";
    }
    geelaw
        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

    这里明确表示只有赋值、自增自减、方法调用和对象创建表达式可以成为表达式语句,而 ?: 表达式不是上述类型,故增加一个分号后不能成为语句。
    abigboy
        6
    abigboy  
    OP
       2019-05-26 19:42:31 +08:00
    @sudri 有返回值也是不行的
    @geelaw 好的,谢谢你了🌹
    MonoLogueChi
        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();` 不行,方法是不是静态的都可以。
    KasuganoSoras
        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
    abigboy
        9
    abigboy  
    OP
       2019-05-26 23:53:14 +08:00 via Android
    @sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~😎
    mario85
        10
    mario85  
       2019-05-27 00:49:09 +08:00 via iPhone
    @MonoLogueChi #7 C#还可以这样玩
    (t.isGoodlooking()?(Action)kissMe:(Action)fuckOff)();
    Java 不行,老实用 if 吧
    geelaw
        11
    geelaw  
       2019-05-27 04:15:07 +08:00 via iPhone   ❤️ 1
    @abigboy #9 大叔?!
    tomoya92
        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";
    }

    }
    ```
    abigboy
        13
    abigboy  
    OP
       2019-05-27 16:16:47 +08:00 via Android
    @geelaw 好吧。。老哥😋
    我错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2830 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.