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

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

  •  
  •   abigboy · 200 天前 · 3018 次点击
    这是一个创建于 200 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    C/C++ 无此限制,C# 有此限制,看来 Java 也有。
        4
    sudri   200 天前
    需要有返回值才行
    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   200 天前 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

    这里明确表示只有赋值、自增自减、方法调用和对象创建表达式可以成为表达式语句,而 ?: 表达式不是上述类型,故增加一个分号后不能成为语句。
        6
    abigboy   200 天前
    @sudri 有返回值也是不行的
    @geelaw 好的,谢谢你了🌹
        7
    MonoLogueChi   200 天前
    需要限定一下语言,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   200 天前
    PHP 可以

    <?php
    function a() {
    return true;
    }
    function b() {
    echo "Is true";
    }
    function c() {
    echo "Is false;";
    }
    a() ? b() : c();

    Output: Is true
        9
    abigboy   199 天前 via Android
    @sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~😎
        10
    mario85   199 天前 via iPhone
    @MonoLogueChi #7 C#还可以这样玩
    (t.isGoodlooking()?(Action)kissMe:(Action)fuckOff)();
    Java 不行,老实用 if 吧
        11
    geelaw   199 天前 via iPhone   ♥ 1
    @abigboy #9 大叔?!
        12
    tomoya92   199 天前
    @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";
    }

    }
    ```
        13
    abigboy   199 天前 via Android
    @geelaw 好吧。。老哥😋
    我错了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2266 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 15:43 · PVG 23:43 · LAX 07:43 · JFK 10:43
    ♥ Do have faith in what you're doing.