x * =和x = x * ...之间的差异?

时间:2014-07-17 12:09:01

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

看看这个功能:

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真)我跟踪:1.i ++ 2. / 3. * =和所有其他可能性但没有答案。为什么呢?

编辑:这不是我所知道的问题。我问为什么编译器在c(4,2)=4时回答c*=n/i++。我跟踪*/++, *++/, /*++, /++*, ++*/, ++/*,但回答不是4。什么是编译器的逻辑?(抱歉英语不好)

3 个答案:

答案 0 :(得分:10)

的情况下
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++);

答案 1 :(得分:2)

由于运算符优先级(或者您喜欢的语言语法),两者是:

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

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

答案 2 :(得分:0)

此:

a *= E;

相当于:

a = a * (E);

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

a *= b + c;

获取翻译为:

a = a * (b + c);

......但不是这样的:

a = a * b + c; // WRONG

因此,行:

c *= n/i++;

等同于:

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

for integers 与<:p>不同

c = c * n / i++;