• python学习笔记(1.1)转自CSDN,知乎


    Python-负数取余(mod)

    CSDN 棠牧师 2018-12-25 15:05:39

    https://blog.csdn.net/weixin_44252966/article/details/85248165

    分类专栏: python知识点 文章标签: Python入门
    版权
    负数取余遵循公式:

    a与d是整数,d非零,那么余数r满足

    a=q*d+r,q为整数,且0<=|r|<|d|

    通常可能有两个r满足定义,r1,r2分别称为正余数、负余数,且r1=r2+d.

    在计算机语言中,同号整数运算,所有语言都遵循尽量让商小的原则,因此7mod3结果为1没有异议。

    在异号的整数运算中,C++和Java会让商尽可能大(比如-7mod3中,d=-2,r=-1)。Python等则让商尽可能小(比如-7mod3中,d=-3,r=2)。

    参考文献:https://www.zhihu.com/question/31344913

    https://www.zhihu.com/question/19811087

    在程序开发中,++i 与 i++的区别在哪里?
    ​https://www.zhihu.com/question/19811087
    叶王
    多看书,看好书
    671 人赞同了该回答

    i++ 与 ++i 的主要区别有两个:
    1、 i++ 返回原来的值,++i 返回加1后的值。
    2、 i++ 不能作为左值,而++i 可以。

    毫无疑问大家都知道第一点(不清楚的看下下面的实现代码就了然了),我们重点说下第二点。
    首先解释下什么是左值(以下两段引用自中文维基百科『右值引用』词条)。
    左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。
    一般来说,左值是可以放到赋值符号左边的变量。但
    能否被赋值不是区分左值与右值的依据。比如,C++的const左值是不可赋值的;而作为临时对象的右值可能允许被赋值。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
    比如,
    int i = 0;
    int *p1 = &(++i); //正确
    int *p2 = &(i++); //错误

    ++i = 1; //正确
    i++ = 5; //错误

    那么为什么『i++ 不能作为左值,而++i 可以』?
    看它们各自的实现就一目了然了:
    以下代码来自博客:为什么(i++)不能做左值,而(++i)可以
    // 前缀形式:
    int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
    {//函数本身无参,意味着是在自身空间内增加1的
    *this += 1; // 增加
    return *this; // 取回值
    }

    //后缀形式:
    const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
    {//函数带参,说明有另外的空间开辟
    int oldValue = *this; // 取回值
    ++(*this); // 增加
    return oldValue; // 返回被取回的值
    }

    如上所示,i++ 最后返回的是一个临时变量,而临时变量是右值。


    空气
    53 人赞同了该回答
    根本区别是语义上的区别,这个书上有,一个返回+之后的值一个返回+之前的值。

    如果没有用到返回值的话,区别在于效率。
    若i是内置的数值类型,两者完全一样
    若i是一些自定义的类,如iterator,++i的效率 > = i++的效率
    对于后者推荐都用++i;对于前者,用哪个是程序风格问题,i++的好处是更符合人类思维习惯,++i的好处是每次都用这种形式就不用考虑i的类型。


    王海波
    游戏开发
    19 人赞同了该回答
    使用返回值之后有区别 如果不使用 没区别
    作者:王海波
    链接:https://www.zhihu.com/question/19811087/answer/526762627
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    使用返回值之后有区别 如果不使用 没区别


    不使用返回值


    使用返回值

    这段汇编是debug下的 不知道release有没有区别 反正我没看出来 ++i比i++快在哪里, 也没看到如楼上说的创建临时对象说明现在的阶段,编译器优化比你想象的强,相信编译器

    廖雪峰
    业余马拉松选手 www.liaoxuefeng.com
    45 人赞同了该回答
    单行语句用 i++;
    表达式内部用(i+1)
    索引永远只用[i]或者[i+1],先加或者后加写成两行。
    优化代码交给编!译!器!
    发布于 2018-05-08

    顺其自然的活着
    可能是三观最正的愤青
    161 人赞同了该回答
    1、首先,单独拿出来说++i和i++,意思都是一样的,就是i=i+1。
    2、如果当做运算符来说,就是a=i++或者a=++i这样的形式。情况就不一样了。

    先说a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;
    而a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;
    举个例子来说,如果一开始i=4。
    那么执行a=i++这条语句之后,a=4,i=5;
    那么执行a=++i这条语句之后,i=5,a=5;
    同理,i--和--i的用法也是一样的。

    编辑于 2017-08-02

    夜色
    一个编程的线程
    5 人赞同了该回答
    ++i是左值,直接原地操作,效率高点,但现在谁还在乎这一点效率呢

    马向彬

    C++中i++是self opreator++(int){ self tmp = *this; ++(*this); return tmp;}++i是self& opreator++(){ ++current; return(*this);}++i与+=操作符等价发布于 2016-01-12

    作者:匿名用户
    链接:https://www.zhihu.com/question/19811087/answer/81254771
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    王英海
    63 人赞同了该回答
    在工作中把i++和++i用出区别的,都该拉出去枪毙。

    寇败
    老游戏程序
    8 人赞同了该回答
    如果只是独立的++i; 和i++; 是基本一样的,到汇编都是一句Add或Inc指令(根据不同的编译器可能会有差异);
    如果是在如下环境:
    int i = 0;
    int j = 0;
    j = ++i;
    j = i++;
    语义上是有差别的:++i 表示在用该表达式的值之前先使 i 的值增 1 ,i++ 表示在用该表达式的值之后再使 i 的值增 1 ;
    性能上应该是一样的(不确定,跟编译器的实现有关),在VS2013下是这样的:
    j = ++i;
    002E17DE mov eax,dword ptr [i]
    002E17E1 add eax,1
    002E17E4 mov dword ptr [i],eax
    002E17E7 mov ecx,dword ptr [i]
    002E17EA mov dword ptr [j],ecx
    j = i++;
    002E17ED mov eax,dword ptr [i]
    002E17F0 mov dword ptr [j],eax
    002E17F3 mov ecx,dword ptr [i]
    002E17F6 add ecx,1
    002E17F9 mov dword ptr [i],ecx
    发布于 2016-02-24

    天涯客
    个人博客www.chinjua.com
    8 人赞同了该回答
    i++和++i的区别楼上各位都说了,我补充一些就行了。(i++)+(i++)+(++i)这类式子是没有任何意义的,不用浪费时间纠缠在这个问题上,你只要会知道i++,++i,i--,--i这4个的区别,会用就够了。那种复杂的式子,用不同的编译器会编译出不同的结果,讨论这个没意义

    笑脸
    IT 旅游
    10 人赞同了该回答
    ++i是先处理完加法,再做其它运算, i++是处理完相关运算(执行完一条语句后)后自加
    发布于 2011-08-12
    ​赞同 10​

    继续浏览内容知乎

    发现更大的世界
    打开

    Chrome
    王xx
    王xx
    还有什么坑是需要我跳的
    11 人赞同了该回答
    i++ 与 ++i 的关系. 好比i是一个姑娘,运算结果就是怀孕,那么i++就是未婚先孕,i在前,++就是结婚的这个运算;++i就是先有++结婚这个运算,后怀孕i,就是已婚受孕。。。。。不知道这个比喻对不对
    2016-11-27

    二胖瘦了
    7 人赞同了该回答
    ++i与i++

    int a = i++;
    执行两次操作,int a = i; i = i+1;

    int a = ++i;

    同样执行两次操作,int a = i +1 ; i = i+1;


    总结:
    (1)i++,将现在的值赋值给变量,将加1的值赋值给下一个变量
    (2)++i,将加1的值赋值给变量,同时将加1值更新为自身当前值

    个人浅见

    白夜行的狼
    一个感性的工科生
    5 人赞同了该回答
    这个其实分内嵌类型和自定义类型,对于内嵌类型其实现在的编译器已经将两者的汇编代码都处理得一样了,但是对于自定义类型,这两者又大大不一样~~具体看我写的博客吧,不想复制过来了

    ++i、i++、i+=1、i=i+1的区别

    编辑于 2018-11-30

    ivers
    程序员一枚
    2 人赞同了该回答
    补充一点:++i得到左值,i++得到右值。
    2011-08-14
    ​​
    继续浏览内容

    知乎
    发现更大的世界 打开

    Chrome
    继续
    AiwiRen AiwiRen
    呆比一个
    5 人赞同了该回答
    就像为什么叫C++而不是++C一样,C++是一种新的语言,++C是C的一个新的版本。

  • 相关阅读:
    [SPOJ-TTM]To the moon
    [BZOJ1901]Zju2112 Dynamic Rankings
    [算法模板]ST表
    [算法模板]树状数组
    [SPOJ-COT]Count on a tree
    [算法模板]倍增求LCA
    【bzoj 3433】{Usaco2014 Jan} Recording the Moolympics(算法效率--贪心)
    【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)
    【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
    【uva 10048】Audiophobia(图论--Floyd算法)
  • 原文地址:https://www.cnblogs.com/mway/p/14143202.html
Copyright © 2020-2023  润新知