zoukankan      html  css  js  c++  java
  • python = 赋值顺序 && C++ side effect


    title: python = 赋值顺序 && C++ side effect
    date: 2020-03-17 15:00:00
    categories: [python][c++]
    tags: 语法

    先是python = 的运算顺序不清楚,然后搞明白了之后自然就想知道C++是什么样的

    1 python =

    1.1 形如 a,b=a,b

    写了一个测试:
    可见赋值顺序是从 = 右侧第一个数开始向右。
    同时如果出现被赋值的数是按照原来的值计算。
    原因我想应该是 = 实现的方法也是函数, = 右侧的a,b先把原来的值压栈了。

    a,b=-1,-2
    a,b,b,a,b=1,2,3,b,a
    print(a,b)
    
    -2 -1
    
    
    a,b=-1,-2
    a,b,b=1,2,3
    print(a,b)
    
    1 3
    

    1.2 链式赋值

    a=b=c=1 顺序是:a=1,b=a,c=a

    >>> k,l=0,[10,20,30,40]
    >>> k=l[k]=3
    >>> l  #下面的结果显示l[3]=3,说明k先被赋值为3,才有l[3]赋值为3
    [10, 20, 30, 3]
    >>> 
    >>>> k,l=0,[10,20,30,40]
    >>> k=l[k]=l[l[k]-1]=3
    >>> l #跟上面结果对比表明:l[k]-1=2,说明l[k]比l[l[k]-1]先执行赋值
    [10, 20, 3, 3]
    
    https://blog.csdn.net/LaoYuanPython/article/details/95300934
    

    2 C++ side effect

    总结就是子表达式的求值顺序是不确定的(C++98/03). 不清楚C11 C14的标准。
    所以尽量应该不用或者加上括号

    在一个表达式里,子表达式的求值顺序是没有定义的。特别的是,你不能假定表达式从左向右求值。 int x=f(3)+g(7) 没有定义 f(),g()哪个先调用。
    int i=1; v[i]=i++;
    结果也是没有定义的或者是v[1]=1,或者是v[2]=1。
    但是有三种运算符的计算顺序是有定义的:逗号(,),逻辑与(&&),逻辑或(| |)。它们保证了左边的运算对象一定要先于右边的运算对象计算。如:b=(a=2,a++)计算后把3赋给b。&&只有在第一个运算对象为true时才算第二个。| |只有在第一个运算对象是false时才算第二个,这叫短路求值。
    注意区分逗号的两种用法:
    f1(v[i],i++)     两个参数;
    f2( (v[i],i++) )   逗号表达式;
    对于f2来说参数只有一个相当于i++。

    原文链接:https://blog.csdn.net/cxyol/article/details/625713

    https://blog.csdn.net/ox_thedarkness/article/details/613122

    https://blog.csdn.net/garfee_guan/article/details/12403987

  • 相关阅读:
    防抖函数
    锁屏功能
    配置编译环境和线上环境之间的切换
    vue-router中的滚动行为
    axios的再次封装
    Anaconda 镜像配置
    Python 包管理工具 pip 与 conda
    Anaconda 安装与卸载
    VS Code 配置和使用
    解决 VS Code 无法使用Ctrl+C等快捷键
  • 原文地址:https://www.cnblogs.com/lqerio/p/13485177.html
Copyright © 2011-2022 走看看