三元运算符可以用于调用方法吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abigboy

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

  •  
  •   abigboy 2019 年 5 月 26 日 5837 次点击
    这是一个创建于 2526 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 年 5 月 26 日 via Android
    没有返回值啊。
    zael
        2
    zael  
       2019 年 5 月 26 日 via iPhone
    静态方法应该用类名调用吧
    geelaw
        3
    geelaw  
       2019 年 5 月 26 日 via iPhone   2
    有些语言要求只有(属性 /事件 /索引器 /字段 /变量 /参数)(复合)赋值 /自增 /自减、方法调用、构造器调用、await、这些表达式才能成为语句,而其他表达式不能做语句(还有其他不是表达式语句的语句构造,略去)。

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

    C/C++ 无此限制,C# 有此限制,看来 Java 也有。
    handbrake
        4
    handbrake  
       2019 年 5 月 26 日
    需要有返回值才行
    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 年 5 月 26 日 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 年 5 月 26 日
    @sudri 有返回值也是不行的
    @geelaw 好的,谢谢你了
    MonoLogueChi
        7
    MonoLogueChi  
       2019 年 5 月 26 日
    需要限定一下语言,C#是可以的

    ```cs
    using System;

    internal class Program
    {
    private static void Main(string[] args)
    {
    Program p = new Program();
    int a = true ? p.() : 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 年 5 月 26 日
    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 年 5 月 26 日 via Android
    @sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~
    mario85
        10
    mario85  
       2019 年 5 月 27 日 via iPhone
    @MonoLogueChi #7 C#还可以这样玩
    (t.isGoodlooking()?(Action)kissMe:(Action)fuckOff)();
    Java 不行,老实用 if 吧
    geelaw
        11
    geelaw  
       2019 年 5 月 27 日 via iPhone   1
    @abigboy #9 大叔?!
    zael
        12
    zael  
       2019 年 5 月 27 日
    @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 年 5 月 27 日 via Android
    @geelaw 好吧。。老哥
    我错了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2830 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 14:04 PVG 22:04 LAX 07:04 JFK 10:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86