在"for"语句中,我应该使用"!="还是"<"?
In a "for" statement, should I use `!=` or `<`?
这两个for语句我都见过:
for(i=0;i<10;i++)
for(i=0;i!=10;i++)
我知道当I达到10
时它们都停止了,但似乎使用第二个更好(我听说)。有什么不同?我还想知道当使用迭代器访问vector的成员时,迭代器条件< vec.end()
和!= vec.end()
的区别是什么
for(i = start; i != end; ++i)
这是"标准的"迭代器循环。它的优点是它可以与指针和标准库迭代器一起工作(你不能依赖于定义了operator<
的迭代器)。
for(i = start; i < end; ++i)
这对标准库迭代器不起作用(除非它们定义了operator<
),但它确实有一个优点,如果由于某种原因超过了end
,它仍然会停止,所以它稍微安全一些。我被教导在迭代整数时使用这个,但我不知道它是否实际上被认为是"最佳实践"。
我通常使用<
。
这两种方法在大多数情况下都可以。
如果由于某种原因,在循环中执行的代码体将i
更改为大于10
的值,则第一个版本将停止循环,但第二个版本将永远执行。
我的日常实践是当我使用简单类型(如整数)迭代循环时使用<
,当我使用静态迭代器时使用!=
for ( initialization ; termination condition ; iteration )
对于每一个,选择你自己最适合你的要求,对于termination condition
,你可以使用任何二进制条件运算符,如>
, <
, >=
, <=
, !=
对于给定的问题,考虑一个随机的情况,
for(i=0;i!=10;i++)
{
.
.
i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
.
.
.
}
在这种情况下,循环是无限的。相反,如果您使用条件i<10
,则会像往常一样工作。所以我的观点是,第一种方法严格设置条件更安全一些。
最佳实践是只对迭代器(c++)和
for (double i = 0.0; i != 1.0; i += 0.1)
printf("yes, I'm an infinite loop ;)");
!如果I的值超过10,=将允许测试计算为true,而<如果我超过10或仅仅等于它,将导致它的值为false。>
如果i的值可能在循环体中改变,则可以考虑这样做。
然而,如果你只是想要做某件事几次,<更具有描述性,但两者都可以。对于简单的一步一步完成10个项目并完成大量工作的循环,应该被认为是次优的,因为它明确了你的意图。>
我知道当I达到10时它们都停止了,但似乎使用它更好第二个(我听到)。
这是一个微优化。使用更有意义的内容(<
以上内容更有意义)。
有什么不同?
第一个版本使用不等运算符!=
,第二个版本使用小运算符<
。
我通常在for循环中使用<
,原因由其他人说明。然而,在while循环和更高级的for循环中,!=
使我们更容易推断程序所做的工作。
假设我想找到在[5,5,5,3,5,2,3,2,0]
这样的数组中第一次运行'5'后的位置。也就是说,我们希望k
的0 <= i < k => a[i] = 5
:
int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
pos = pos+1;
一旦循环执行,我们知道循环保护的反向为真:pos == N || a[pos] != 5
。在任何一种情况下,我们都有我们想要的pos
。
现在假设我们在循环保护中使用了<
,那么之后我们所知道的就是pos >= N || a[pos] != 5
,但这不是我们想要的情况。做了更多的工作,我们可以证明我们不可能在pos > N
中,但与在循环保护中只使用!=
相比,这似乎是浪费时间。
- enum是C++中的宏变量还是整数变量
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在命名空间中定义函数还是限定函数
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 架构决策:返回std::future还是提供回调
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 异常属于C++中的线程还是进程
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 返回值优化:显式移动还是隐式
- <<操作员在下面的行中工作
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 为什么需要知道一个类是平凡的还是有平凡的构造函数
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在这种情况下,我真的复制了字节还是复制了字符?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件