C++ 在浮动上使用增量(运算符+;+;)是错误的样式吗?

C++ 在浮动上使用增量(运算符+;+;)是错误的样式吗?,c++,coding-style,floating-point,C++,Coding Style,Floating Point,在浮点数上使用增量运算符(++)是否被视为“错误样式”?它编译得很好,但我发现它很臭,而且违反直觉 问题:在什么情况下对浮点变量使用++比+=1.0f更合理和更好?如果没有用例,有没有一个值得尊敬的C++风格指南,明确地指出浮点上的++是邪恶的? 对于float++来说,增量不是最小的可能值,而是1.0。1.0f没有特殊含义(与整数1不同)。这可能会使读者感到困惑,使他认为变量是int 对于float,不能保证运算符++更改参数。例如,以下循环不是无限的: float i, j; for (i=

在浮点数上使用增量运算符(++)是否被视为“错误样式”?它编译得很好,但我发现它很臭,而且违反直觉

问题:在什么情况下对浮点变量使用
++
+=1.0f
更合理和更好?如果没有用例,有没有一个值得尊敬的C++风格指南,明确地指出浮点上的++是邪恶的? 对于float++来说,增量不是最小的可能值,而是1.0。1.0f没有特殊含义(与整数1不同)。这可能会使读者感到困惑,使他认为变量是int

对于float,不能保证运算符++更改参数。例如,以下循环不是无限的:

float i, j;
for (i=0.0, j=1.0; i!=j;i=j++);
因此,在--之后立即执行+/-不能保证值不变。

通常不为浮点定义
++/--
,因为不清楚浮点应该用哪个值递增。因此,您可能在一个系统中运气好,
++
导致
f+=1.0f
,但在某些情况下这可能无效。因此,对于浮动,您必须提供一个特定的值


++/--
定义为“增量/减量1”。因此,这适用于浮点值。然而,我个人认为,对于不知道这个定义(或者只适用于整数)的人来说,这可能会让人困惑,因此我建议使用
f+=1.0f
当你向浮点添加大量
1.0
时,由于浮点运算,你最终可能会有点不对劲

最好的办法是

for ( int i = 0; i < 100; i++ )
{
     float f = 2.433f + i * 1.0f;
for(int i=0;i<100;i++)
{
浮动f=2.433f+i*1.0f;
而不是

for ( float f = 2.433f; f < 102.433f; f += 1.0f )
for(浮点f=2.433f;f<102.433f;f+=1.0f)

在第二种情况下,浮点算术错误会累加,而在第一种情况下则不会。正如某些用户在下面的评论中指出的那样,添加积分浮点可能不会累加错误,但一般来说,避免它是一个好主意。

这是一种糟糕的风格。
++
--
旨在将左值设置为下一个值或上一个值,如下一个或上一个整数、数组中的下一个或上一个元素(用于指针)、容器中的下一个或上一个元素(迭代器)等


下一个值和上一个值对于浮点数没有很好的定义。请明确地执行
f+=1.

在浮点数或双操作数上使用
++
--
并没有什么错。它只是简单地加上或减去1。这就是它的作用所在!

我意识到这是一个老问题,但我想指出一点,这些都不是问题其他答案也提出了(尽管一些评论对此表示赞同)


对于那些懒得阅读关于为什么
++
--
的行为可能会让一些人感到困惑的完整解释的人,我将直接切入要点:

制定代码的人员是否理解某一行为比行为是否定义明确更重要。

用Donald Knuth的话说:

编写最好的程序是为了使计算机能够快速地执行它们,并使人类能够清楚地理解它们

(我的重点。)

如果团队中的每个人都了解这种行为,那么就有合理的理由使用操作员

如果您的团队中的一些人在与浮点结合使用时遇到了
++
-
运算符的问题,并声称他们发现
+=1
-=1
更具可读性,那么有一个很好的例子可以避免
++
-
以提高其他团队成员的可读性呃

虽然这是一个应该在每个团队的基础上做出的决定,但我个人认为,在浮点类型的情况下,
+=1
-=1
肯定不会比
+
-
更清晰,而事实上我们的答案对
+
的清晰性存在分歧>是否有足够的证据表明其含义并非“显而易见”

如果有另一个令人信服的理由选择
++
-
(例如,在迭代器的情况下,只有随机访问迭代器支持
+=
-=
,因此
+
-
更惯用)那么它将值得更多的辩论或考虑,但考虑到
+
-
对于浮点而言相当于
+=1
-=1
,可读性应该是唯一的考虑因素


为什么这种行为会令人困惑是一个有点复杂的话题

虽然在大多数算术类型的上下文中,
++
-
通常意味着
+=1
-=1
,但当与其他类型一起使用时,该定义并不完全成立,坦率地说,似乎有点幼稚

在迭代器的情况下,
++
-->
表示“前进迭代器”和“后退迭代器”。有人可能会说,这与加减1的行为类似,但在这种情况下,“1”不是一个具体的实体,可能会导致混淆

因此,对于迭代器的情况,更合适的类比是
++
表示“下一个值”,而
--
表示“上一个值”(其他语言在
succ
pred
函数的形式上有类似的想法)

对于迭代器来说,“后继函数”和“前置函数”的相似性更好,这正是混淆的原因——有些人认为
++
-
是“后继函数”和“前置函数”的意思,在浮点值的上下文中,这意味着添加“epsilon”值