在循环的停止条件下访问数组值是否安全?

时间:2012-11-01 00:12:07

标签: c++ arrays loops standards conditional-statements

为了提高我的clique-partitioning程序(使用有序数组)的性能,我在for循环的停止条件中包含了对我循环的数组元素的访问。

int myValue = 13;

for (int i=0; array[i] < myValue; i++)
{
    //performing operations on the array
}

这显然不安全,因为我的数组可能只包含小于myValue的值,所以我尝试了这个

int myValue = 13;

for (int i=0; i < array.size() && array[i] < myValue; i++)
{
    //performing operations on the array
}

在这个实现中,一切似乎都顺利,但如果我改变条件,我会遇到第一个例子的同样问题。

int myValue = 13;

for (int i=0; array[i] < myValue && i < array.size(); i++)
{
    //performing operations on the array
}

因此,我推断这显然是由于编译器设置两个条件的顺序的方式,因为在最后一种情况下,即使我要求仅在i不大于{{1}}时才进入循环数组的大小,我之前正在读取一个可能超出数组范围的值。

我的问题是:它是否像我在第二个实现中一样安全,或者编译器有时会切换我的控制条件导致不安全的代码?

感谢。

2 个答案:

答案 0 :(得分:7)

&&(逻辑和)运算符总是短路,如果可以的话。你的第二个例子是安全的。

注意,这仅适用于原始类型,而不适用于重载布尔运算符的那些。

因为没有standard quote,没有自尊的C++答案是完整的:

  

5.14.1(逻辑AND)   和&amp;&amp;操作员组从左到右。操作数都在上下文中转换为bool类型(第4条)。   如果两个操作数都为真,则结果为true,否则为false。不像&amp;,&amp;&amp;保证从左到右   评估:如果第一个操作数为假,则不评估第二个操作数。

     

5.14.2(逻辑或)   ||操作员组从左到右。操作数都在上下文中转换为bool(第4条)。它   如果其操作数之一为真,则返回true,否则返回false。与|,||不同保证从左到右   评价;此外,如果第一个操作数的计算结果为true,则不计算第二个操作数。

答案 1 :(得分:0)

我不会做任何一个例子。这样做:

for (int i=0; i < array.size(); i++) {
    if (array[i] >= myValue) {
        break;
    }

    // do stuff
}

这样你就不会有任何困惑或缺乏安全感。它具有与其他示例相同的速度,但稍后调试更为直接。