看看这个功能:
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。什么是编译器的逻辑?(抱歉英语不好)
答案 0 :(得分:10)
在
的情况下c = c * n / i++;
您首先乘以c
和n
,然后将其除以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++;