【发布时间】: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++