为什么将int格式化为6*1000*1000而不是6000000?

4
我正在阅读一份用C语言编写的中间件代码,其中他们写了以下内容:
usleep(6*1000*1000);

所以我的问题是:

为什么要像这样编写代码?而不直接写6000000?这样做会对程序的性能产生影响吗?


3
为什么不直接写sleep(6),这样也能表达“6秒”的意思,而且没有任何阅读障碍。 - Jonathan Leffler
4
当你阅读大量代码时,有时很难准确看出数字中到底有多少个零。你能立即分辨出“6000000”、“60000000”和“600000”之间的差异吗? - abelenky
1
比这种无意义的东西更好、更安全的技巧是:(int)(6.0*10e6) - Lundin
2
@Lundin:你的(int)(6.1*10e6)建议在两个方面存在致命缺陷,一是使用了6.1而需要6,二是sleep时间是目标时间的10倍。这些都表明它与更好、更安全相去甚远。—— Lundin在时间限制到期之前成功纠正了他的评论(但不是数量级为错:使用6.0*1E66.0*1.0E6将是可行的)。 - Jonathan Leffler
3
“610001000”与“6000000”的问题在于数据类型。考虑“6100010001000”(使用“int”计算)和“6000000000”以及“6LL100010001000”(使用“long long”计算)。 - chux - Reinstate Monica
显示剩余6条评论
3个回答

8

usleep()函数需要传入以“微秒”为单位的参数。

这是将微秒转换成秒的“视觉转换”,不会对代码造成影响,因为任何一个还算过得去的编译器都会在编译时计算出来。


1
"不会对代码产生影响" --> 但要注意16位int6*1000*1000可能会发生溢出。 - chux - Reinstate Monica

7

这只是为了让源代码更易于阅读。通过乘法,数字显然是六百万。

由于它评估为常量,编译器将在编译时评估常量,并且编译后的代码不会有任何差异。


1
使用乘法时,根据int范围和所使用的数字,可能会导致乘积溢出。(希望会出现警告)没有乘法的常量就不会有这个问题。 - chux - Reinstate Monica

5

很可能,这是为了可读性而这样做的。

看到代码中的6000000,您可能无法立即看出有多少个零。这个值与60000000600000之间的视觉区别不大。将其拆分后,更容易看清楚。

任何合理的编译器都应该在编译时计算6*1000*1000,因此不应该会影响性能。


1
注意:使用16位的int60000006*1000*1000不同。 - chux - Reinstate Monica

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