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++;
您首先将c
和n
相乘,然后将其除以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')` 之间的区别
CodeIgniter 错误报告 1.7.x 和 2.x 之间的区别