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

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

  •  
  •   rizon ·
    othorizon · 2019-03-11 11:26:49 +08:00 · 7363 次点击
    这是一个创建于 2071 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天写代码,偶然从 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 条回复    2019-03-12 06:24:43 +08:00
    1a0ma0
        1
    1a0ma0  
       2019-03-11 11:32:23 +08:00 via iPhone
    这不是常识吗……
    smeraldo
        2
    smeraldo  
       2019-03-11 11:33:58 +08:00
    火星😂。。
    liuzhedash
        3
    liuzhedash  
       2019-03-11 11:34:08 +08:00
    没有被 i=i++这种考题折腾过嘛?
    Lin0936
        4
    Lin0936  
       2019-03-11 11:35:05 +08:00
    这。。。。。
    congeec
        5
    congeec  
       2019-03-11 11:38:56 +08:00
    你没用过 C 语言么?
    你不知道 python 3.8 的 assignment expression 么?
    lihongjie0209
        6
    lihongjie0209  
       2019-03-11 11:40:59 +08:00
    C 就是这样,Java 从 C 直接抄过来的
    Raymon111111
        7
    Raymon111111  
       2019-03-11 11:41:16 +08:00
    没读过源码吗...

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


    while ((strLine = br.readLine()) != null) {
    System.out.println (strLine);
    }
    phpcyy
        23
    phpcyy  
       2019-03-11 14:00:48 +08:00
    golang 里边好像不是这样的
    grewer
        24
    grewer  
       2019-03-11 14:00:58 +08:00
    你也网上🏄啊
    gamexg
        25
    gamexg  
       2019-03-11 14:17:01 +08:00
    c 里面容易出的一个错误

    if (i=1){
    }

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

    if (1==i){
    }

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