看看这个函数:
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)我跟踪了with:1.i++ 2./ 3.*=和所有其他可能性,但没有答案。为什么?
编辑:正如人们所知,这不是我的问题。我问为什么编译器回答c(4,2)=4时c*=n/i++。我追踪了*/++, *++/, /*++, /++*, ++*/, ++/*,但答案根本不是4。编译器的逻辑是什么?(抱歉英语不好)
发布于 2014-07-17 12:13:07
在以下情况下
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++);发布于 2014-07-17 12:13:57
由于运算符优先(或语言语法(如果您愿意),这两者是:
c = ((c * n) / i++);对比
c = c * (n / i++);发布于 2014-07-17 12:14:44
这是:
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++;https://stackoverflow.com/questions/24803156
复制相似问题