V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

你知道 赋值语句其实是有返回值的吗?

  •  
  •   rizon ·
    othorizon · Mar 11, 2019 · 7999 views
    This topic created in 2605 days ago, the information mentioned may be changed or developed.

    今天写代码,偶然从 google 工具类的源码中发现了赋值语句是有返回值的! 然后我瞬间想明白了,一个之前困扰我许久的 if 语句块中直接使用赋值语句的那个很久之前的问题。 /t/531367

    先放结果

        Long a;
        public Long test() {
            if ((a = 123L) == 321L) {
                System.out.println(a);
            }
            return a = 123L;
        }
    

    网上有人分析过汇编,https://blog.csdn.net/w605283073/article/details/85219022

    我估计还是有很多人不知道这件事,或者就是忘了,再或者就是没去想这个返回值是可以简化代码书写的。所以分享一下

    41 replies    2019-03-12 06:24:43 +08:00
    1a0ma0
        1
    1a0ma0  
       Mar 11, 2019 via iPhone
    这不是常识吗……
    smeraldo
        2
    smeraldo  
       Mar 11, 2019
    火星😂。。
    liuzhedash
        3
    liuzhedash  
       Mar 11, 2019
    没有被 i=i++这种考题折腾过嘛?
    Lin0936
        4
    Lin0936  
       Mar 11, 2019
    这。。。。。
    congeec
        5
    congeec  
       Mar 11, 2019
    你没用过 C 语言么?
    你不知道 python 3.8 的 assignment expression 么?
    lihongjie0209
        6
    lihongjie0209  
       Mar 11, 2019
    C 就是这样,Java 从 C 直接抄过来的
    Raymon111111
        7
    Raymon111111  
       Mar 11, 2019
    没读过源码吗...

    很多这种
    suit
        8
    suit  
       Mar 11, 2019
    在 C++,运算符可以用函数重载,所以有返回值一点都不奇怪
    jeffersonpig
        9
    jeffersonpig  
       Mar 11, 2019
    这真的是没几个人不知道的吧
    yim7
        10
    yim7  
       Mar 11, 2019
    学 c 没遇到过吗 ,while ( (ch = getchar()) != '#') {}
    ballshapesdsd
        11
    ballshapesdsd  
       Mar 11, 2019
    我一个学 python 的都知道(微笑)
    dorentus
        12
    dorentus  
       Mar 11, 2019
    并不是所有编程语言的赋值语句都是可求值(有返回值)的。
    AV1
        13
    AV1  
       Mar 11, 2019
    你知道逗号(,)其实是有返回值的吗?
    var a = (1, 2, 3);
    console.log(a);//=>3
    idyu
        14
    idyu  
       Mar 11, 2019
    if(($erpRegistDateGeqUnix = strtotime($erpRegistDateGeq)) > 0) {
    $data['erpRegistDateGeq'] = date('Ymd', $erpRegistDateGeqUnix);
    }
    PHP
    zycpp
        15
    zycpp  
       Mar 11, 2019 via iPhone
    c 语言刷题必备语句
    while((ch=getchar())!=EOF)
    HuHui
        16
    HuHui  
       Mar 11, 2019 via Android
    b = (a+b) - (a=b);
    看来没学过这个
    expy
        17
    expy  
       Mar 11, 2019
    a=b=c 大概就用到了吧。
    wingkou
        18
    wingkou  
       Mar 11, 2019 via Android   ❤️ 1
    @DOLLOR C 艹甚至还能重载逗号,这才是最骚的,lz 估计要更惊讶。
    183shl
        19
    183shl  
       Mar 11, 2019 via Android
    初学时经常被 if 中写一个=困扰半天😁
    lazyfighter
        20
    lazyfighter  
       Mar 11, 2019
    之前看源码的时候 这个东西困扰了我很久
    zsdroid
        21
    zsdroid  
       Mar 11, 2019
    a = b = 123; 了解下
    qwertyegg
        22
    qwertyegg  
       Mar 11, 2019
    早期 java 里面的读行标准做法


    while ((strLine = br.readLine()) != null) {
    System.out.println (strLine);
    }
    phpcyy
        23
    phpcyy  
       Mar 11, 2019
    golang 里边好像不是这样的
    grewer
        24
    grewer  
       Mar 11, 2019
    你也网上🏄啊
    gamexg
        25
    gamexg  
       Mar 11, 2019
    c 里面容易出的一个错误

    if (i=1){
    }

    条件永远成立,所以后来出现另一种写法:

    if (1==i){
    }

    来解决误写的问题
    ExploreWay
        26
    ExploreWay  
       Mar 11, 2019
    哇,了解了,第一次看到,不过这种操作知识特殊一些,实际用途大吗
    rochek
        27
    rochek  
       Mar 11, 2019 via Android
    @gamexg 这种编译器会警告你的
    tabris17
        28
    tabris17  
       Mar 11, 2019
    不同的语言不一样
    另外:1L+1
    dosmlp
        29
    dosmlp  
       Mar 11, 2019
    作为 c++程序员,这是常识吧,操作符也是函数的一种
    darknoll
        30
    darknoll  
       Mar 11, 2019   ❤️ 1
    什么叫赋值语句的返回值,语句哪有什么返回值,这是表达式的值
    gamexg
        31
    gamexg  
       Mar 11, 2019
    @rochek #27 是的,所以现在不流行 1 == i 的写法了。
    jswh
        32
    jswh  
       Mar 11, 2019
    不是所有语言的复制语句都有返回值。
    jswh
        33
    jswh  
       Mar 11, 2019
    @jswh 赋值
    chiu
        34
    chiu  
       Mar 11, 2019 via Android
    写错过 if(i=1),但程序还能跑,应该就知道赋值语句是有返回值的了
    masker
        35
    masker  
       Mar 11, 2019 via Android
    “我读了 Google 工具类的代码,好像发现一个不得了的事情,赶紧上 V2EX 炫一下我读了 Google 工具类的代码”
    carlclone
        36
    carlclone  
       Mar 11, 2019
    所以赋值不该有返回值 , 就不会出现少写个=号出 bug 的问题了
    Joyboo
        37
    Joyboo  
       Mar 11, 2019
    1L +1 常识问题
    MrUser
        38
    MrUser  
       Mar 11, 2019
    心疼 LZ 一秒,LZ 只是好心科谱一下,哈哈
    Death
        39
    Death  
       Mar 11, 2019
    大多数语言的 spec 里会给出语句是否是一个值的说明
    hirasawayui
        40
    hirasawayui  
       Mar 11, 2019
    你以为自己发现了新大陆,谁知道。。。是辆公交车
    Arxz
        41
    Arxz  
       Mar 12, 2019
    区分 expression 和 statement 不是基础吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2663 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 138ms · UTC 16:01 · PVG 00:01 · LAX 09:01 · JFK 12:01
    ♥ Do have faith in what you're doing.