x*= 和 x=x* 之间的区别...?

Posted

技术标签:

【中文标题】x*= 和 x=x* 之间的区别...?【英文标题】:difference between x*= and x=x*...? 【发布时间】: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 支撑确实更难阅读。 :( 【参考方案1】:

如果是

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

【讨论】:

因此,如果您不确定您的同事是否像您一样精通运算符优先级,请仅在执行的唯一操作时使用复合赋值运算符;-) @ar2015 可能会,也可能不会。唯一的方法是创建一个基准程序,在启用优化的情况下构建它,通过反汇编程序比较生成的代码,然后运行基准来测量(如果生成的代码不同)。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

这个:

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

【讨论】:

以上是关于x*= 和 x=x* 之间的区别...?的主要内容,如果未能解决你的问题,请参考以下文章

typescript 中 `import x = require('x')` 和 `const x = require('x')` 之间的区别

Binding 和 x:Bind 之间的区别

x*= 和 x=x* 之间的区别...?

CodeIgniter 错误报告 1.7.x 和 2.x 之间的区别

python3中int(a//x)和int(a/x)之间的区别[重复]

Laravel 7.x:新鲜和刷新方法之间的区别?