【问题标题】:difference between x*= and x=x*...?x*= 和 x=x* 之间的区别...?
【发布时间】:2014-07-17 12:09:01
【问题描述】:

看看这个函数:

int c(int n,int k) {
    if (n<0 || k<0 || n<k) {
        return 0;
    }
    int c=1,p=n-k,i=1;
    while (n>p) {
        c = c * n/i++; // <<<
        n--;
    }
    return c;
}

当我将 c=c*n/i++ 更改为 c*=n/i++ 时,函数无法正常工作。例如 c(4,2)=4 (=6 true) 我追踪了:1.i++ 2./ 3.*= 和所有其他可能性,但没有答案。为什么?

编辑:正如人们所知,这不是我的问题。我问为什么编译器在c*=n/i++ 时回答c(4,2)=4。我追踪了*/++, *++/, /*++, /++*, ++*/, ++/*,但答案根本不是 4。编译器的逻辑是什么?(抱歉英语不好)

【问题讨论】:

  • 您已将局部变量命名为与封闭函数相同。走进去,我们需要谈谈......
  • 我相信那里有一个额外的花括号。小心你的缩进,阅读代码的人可能很快就会认为return 0 之后的代码是if 语句块的一部分。
  • @jrok:有些语言(Turbo Pascal?VB?)可以将函数名用作返回变量。 IE。最后分配的值是返回的值。 C++ 当然完全不是这样的。
  • K&R 支撑确实更难阅读。 :(

标签: c++ visual-studio-2010 visual-c++


【解决方案1】:

如果是

c = c * n / i++;

首先cn相乘,然后将其除以i,最后将i相加。

当你这样做时

c *= n / i++;

你先对i进行除法和加法,然后做乘法。


换句话说:

c = c * n / i++;

等于

c = (c * n) / i++;

虽然

c *= n / i++;

等于

c = c * (n / i++);

【讨论】:

  • 因此,如果您不确定您的同事是否像您一样精通运算符优先级,请仅在执行的唯一操作时使用复合赋值运算符;-)
  • @ar2015 可能会,也可能不会。唯一的方法是创建一个基准程序,在启用优化的情况下构建它,通过反汇编程序比较生成的代码,然后运行基准来测量(如果生成的代码不同)。
【解决方案2】:

由于运算符优先级(或语言语法,如果您愿意),两者是:

c = ((c * n) / i++);

c = c * (n / i++);

【讨论】:

    【解决方案3】:

    这个:

    a *= E;
    

    等价于:

    a = a * (E);
    

    如果你有一个复杂的表达式行如下:

    a *= b + c;
    

    翻译为:

    a = a * (b + c);
    

    ...但不是这样的:

    a = a * b + c; // WRONG
    

    因此,行:

    c *= n/i++;
    

    等价于:

    c = c * (n / i++);
    

    对于整数不一样:

    c = c * n / i++;
    

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2011-12-26
      • 2011-08-20
      相关资源
      最近更新 更多