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

Java : 踩过这个坑没?

  •  
  •   oska117 · 5 天前 · 3923 次点击
    String a = "a";
    
    String b = "b";
    
    String c = a + "_" + b==null?"":b;
    
    

    上面的代码我一直以为 c 会返回 "a_b"

    实际上却返回的是 "b" (+运算符优先级高于三目)

    为啥我一直觉得 这样写没问题呢?

    关键是我同事也有这种错觉。

    66 回复  |  直到 2019-06-13 23:57:34 +08:00
        1
    GPLer   5 天前 via Android   ♥ 1
    没记错的话三目运算符的优先级是最低的,使用时本来就要注意加括号,之所以你认为没问题是因为错误的缩进。
        2
    rainmakeroly   5 天前 via Android   ♥ 1
    不是错觉,是二。有括号不用。
        3
    hoyixi   5 天前   ♥ 22
    这样写代码的早点开除,生活能更美好点
        4
    wucao219101   5 天前   ♥ 2
    键盘上的括号是黄金按钮舍不得按吗?哈哈
        5
    zhaishunqi   5 天前 via iPhone
    就是 b
        6
    africwildman   5 天前
    容易绕进去的代码还是用括号括一下保险。
        7
    anyele   5 天前 via Android   ♥ 2
    并不是 Java 的坑,是你写出来坑自己,坑别人
        8
    CEBBCAT   5 天前   ♥ 1
    虽然我算对了数了,但还是被标题偏进来了的,楼主你赢了
        9
    luozic   5 天前 via iPhone
    括号不用?
        10
    Takamine   5 天前 via Android
    Java:这个锅我不背。

    如果对运算优先级不熟,请多加括号。:doge:
        11
    iiii   5 天前 via Android
    这能怪到 Java?
        12
    potatowish   5 天前
    看到这么写代码的,我会过去打死他
        13
    Leammin   5 天前 via Android
    idea 这样的有提示,我已经看到公司代码里好几处这样的写法了😵
        14
    Navee   5 天前
    这不是语言的坑,你这个写法就有歧义
        15
    xrlin   5 天前
    上一个这么写的已经被拖去打靶了
        16
    Ahaochan   5 天前
    int i = 0;
    System.out.println(i++ + ++i + ++i);
    请(
        17
    oneisall8955   5 天前 via Android
    为啥不用括号。。。
        18
    vanhukset   5 天前
    代码没有这么写的
        19
    Kilerd   4 天前 via iPhone
    首先代码不会这么写,其次空格强行干扰优先级判断
        20
    Vegetable   4 天前
    同一行,多个运算符时,除非各个运算符的优先级明显相同,也就是连续+-,连续* /,或者连续 and or 时,我才不用括号,否则为了可读性也要加上括号,这导致我其实对各个语言的运算符优先级都没什么认识,我需要优先级高的都用括号了
        21
    cheng6563   4 天前 via iPhone
    还真没遇到
    int b=2;
    int a=b=3;
    结果不是很清晰的?
        22
    silentstorm   4 天前 via Android
    神经病才这么写代码,纯属跟自己过不去。
        23
    kevinWHX   4 天前 via iPhone
    按照大类,算数运算符 比较运算符 逻辑运算符 优先级依次降低
        24
    gramyang   4 天前
    一般来说,烦了这个错误,悄悄的不做声,或者说自己看错了,然后下次改正就行了。。。。

    理直气壮的说出来小心被优化啊
        25
    wozhizui   4 天前
    有记和查运算优先级的时间,还不如加个括号,这哪是什么坑。
    另外,我读的时候就是 b 啊。
    Java 应该是最稳的老狗语言了。
        26
    AlphaStone   4 天前
    没踩到,看一眼就知道是 b
        27
    sonyxperia   4 天前
    我从来都是用括号的,记什么优先级
        28
    cway   4 天前
    肯定是 b 啊,搁谁第一眼都差不多是,没括号 a + "_" + b 就是一个整体
        29
    passerbytiny   4 天前
    格式化后的代码:
    String a = "a";

    String b = "b";

    String c = a + "_" + b == null ? "" : b;

    有时间破坏格式化,没时间加括号。
        30
    HENQIGUAI   4 天前
    没加括号,空格也不好好用,规范都读哪儿去了?
        32
    Sornets   4 天前
    面试最烦碰见这种 xx 题
        33
    simonv3ex   4 天前   ♥ 1
    a + "_" + b 就不等于 null 啊,所以结果是 b
        34
    lyy16384   4 天前
    @Vegetable #20 关系运算符之间也有优先级的吧
        35
    pkookp8   4 天前 via Android
    错觉来自于空格,请加上空格再看一遍
    还有错觉搜索一下运算符优先级对着再看一遍
    如果懒得看随便找一种语言跑一下这段代码,结果都一样
        36
    calming   4 天前
    写这种代码自己心里过得去?
        37
    460881773   4 天前
    对不起 一下子就算出是 b
        38
    yaoper   4 天前
    自己造作的坑。
        39
    itmyhome126   4 天前
    这不是基础问题吗。。
        40
    zifangsky   4 天前
    如果对运算优先级不熟,请多加括号!
        41
    jinksw   4 天前
    遇到过这个问题 一下就记住了 遇到之前 跟你想的一样 😆
        42
    szq8014   4 天前
    这并不是坑,而是脑子有泡
        43
    ctsua   4 天前
    不就是个三目吗
        44
    Banxiaozhuan   4 天前
    小学生?
        45
    ipwx   4 天前
    不同优先级的运算符混用永远加括号。小学生都会的操作。。。
        46
    tonyli   4 天前
    就是 b 啊,没毛病啊!
        47
    ruok   4 天前
        48
    iccfish   4 天前
    这算啥坑,这是自己不懂吧。
        49
    FrankHB   4 天前   ♥ 1
    当优先级这种智熄设计遇到了 zz 用户就是这样个下场……
    被幼稚园数学毒害的中缀破烂语法扔了哪来那么多破事。
        50
    matthewxu123   4 天前
    初级题
        51
    beidounanxizi   4 天前 via iPhone
    go 就摒弃了这点
        52
    zsy979   4 天前
    为什么会以为是 "a_b"呢?
        53
    pmispig   4 天前
    写这种代码的人还是早点开除吧
        54
    jamesliu96   4 天前 via Android
    佛了,返校重修吧
        55
    fxplay   4 天前   ♥ 1
    @zsy979
    他想的应该是这样的。
    String a = "a";

    String b = "b";

    String c = a + "_" +( b==null?"":b);
        56
    IllllI   4 天前
    你这写的就是 B 你想表达什么 直说
        57
    sesmond   4 天前
    我想说加个括号会 X 吗
        58
    KannaMakino   4 天前 via iPhone
    还好吧,不过这么写有毒
        59
    way2create   4 天前
    ...这种不叫坑吧 就是运算符优先级的问题,只能说基础不牢又不爱加括号了,我也经常忘,所以我加括号
        60
    flyingghost   4 天前
    说实话,这个“坑”字的定义有问题。
    坑,常用来描述反常理的,有 bug 的,太 trick 绝大多数人都不知道的旮旯。之所以是坑,就是绝大多数人都会掉进去。
    而运算符优先级,既是常理,又没 bug,也一点 trick 都没有。这不是坑,这是基础知识存在盲点,是个人问题。
        61
    flyingghost   4 天前
    另一个话题,虽然对于运算符优先级我就从来没记清过,但印象里凡是自带?:三目运算符的语言,好像都是超低优先级,都是排在+-*/之后。
    所知语言有限,实在想不起例外。我尽力了。
        62
    jptx   4 天前
    如果对这种运算符优先级不熟悉的话,直接一把括号走天下
        63
    HunterPan   4 天前
    这样写 打死你,这是对别人负责
        64
    alikesi   4 天前 via Android
    不用括号依靠记忆优先级和用汇编写代码有什么区别?
        65
    liuxey   4 天前
    你是我看到的第 N 个基础不牢,被三目“坑”的程序员
        66
    FrankHB   3 天前
    @flyingghost 我发现所谓的优先级除了一个模棱两可的技术优势,剩下可以说毫无意义,全是跟风:因为历史既有以及别人习惯了这个设计,所以我也要用适应这种设计,即便根本说不清楚习惯是怎么来的,有哪些合理性。
    这就是坑。反过来,分析清楚为什么这是个烂设计的思路,才是基础知识。
    当然,你可以试着想想一下优点是什么,再做结论。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2336 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 15:37 · PVG 23:37 · LAX 08:37 · JFK 11:37
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1