x*=和x=x*之间有什么区别?

5

看一下这个函数:

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。 编译器的逻辑是什么?(抱歉我的英语不好)

3
你将一个本地变量命名为与封闭函数相同的名称。请进来,我们需要谈谈。 - jrok
1
我认为那里有一个额外的花括号。注意你的缩进,读代码的人可能会很快地认为return 0后面的代码是if语句块的一部分。 - Nasser Al-Shawwa
@jrok:有些语言(Turbo Pascal?VB?)可以使用函数名称作为返回变量。也就是说,最后赋值的值就是返回的值。当然,C++并不是这样的。 - MSalters
K&R风格的括号确实更难阅读。:( - Almo
3个回答

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
所以,如果你不确定你的同事和你一样熟练掌握运算符优先级,请只在唯一需要执行复合赋值操作时使用它们 ;-) - rubenvb
@ar2015 可能会,也可能不会。唯一的方法是创建一个基准程序,启用优化构建它,通过反汇编器比较生成的代码,然后运行基准测试以测量(如果生成的代码有所不同)。 - Some programmer dude

2

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

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

对比

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

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++);

对于整数而言,哪个不同于

c = c * n / i++;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接