多个如果没有别的不等于if else? C ++

时间:2015-12-03 21:39:33

标签: c++ if-statement

尝试按升序对0,1,2的向量进行排序。我认为以下两个是等价的:

void sortColors(vector<int>& nums) {
    int i=0,j=nums.size()-1;
    int k=0;
    while (k<=j){
        if (nums[k]==0){
            swap(nums[i],nums[k]);
            ++i;
            ++k;
        } 
        else if (nums[k]==1) {
            ++k;
        }
        else if (nums[k]==2){
            swap(nums[j],nums[k]);
            --j;
        }
    }
}

void sortColors(vector<int>& nums) {
    int i=0,j=nums.size()-1;
    int k=0;
    while (k<=j){
        if (nums[k]==0){
            swap(nums[i],nums[k]);
            ++i;
            ++k;
        }
        if (nums[k]==1) ++k;
        if (nums[k]==2){
            swap(nums[j],nums[k]);
            --j;
        }
    }
}

但是,只有第一个是正确的。当测试运行nums = {2,0}时,第一个执行正确的排序,而第二个函数不执行任何操作。这有什么区别?

3 个答案:

答案 0 :(得分:2)

不,它们不相同,因为您更改了用于条件的变量:

while (k<=j){
    if (nums[k]==0){              
        swap(nums[i],nums[k]);
        ++i;
        ++k;
    }
    if (nums[k]==1) ++k;         // if num[k] == 1
    if (nums[k]==2){             // now k isnt 
                                 // the same as for the last condition
        swap(nums[j],nums[k]);
        --j;
    }
}

使用if-else版本时,只执行其中一个分支。

答案 1 :(得分:1)

输出存在差异,但不是您需要知道的。你需要知道的是:

多个if语句意味着每个if块都有可能被执行。因此,如果您有N个条件,那么将执行0到N个块。

int a = 0;
if(a == 0)
    a++;
if(a == 1)
    a++;
if(a == 2)
    a++;
if(a == 3)
    a++;

所有这些都将执行,a将为4。

单行if / else if / else语句意味着每次使用它们时只会执行一个块。因此,如果您有N个条件,那么只会执行其中一个块。

int a = 20;
if(a == 0)
    a++;
else if(a == 1)
    a++;
else if(a == 2)
    a++;
else
    a = 0;

只执行else块,因此a将为0

最后,一行if / else if语句意味着AT MOST将执行一个块。有可能他们都没有执行,因为你没有最后的其他声明来捕捉&#34;其他一切&#34;。因此,如果您有N个条件,那么将执行0或1个块。

int a = 20;
if(a == 0)
    a++;
else if(a == 1)
    a++;
else if(a == 2)
    a++;
else if(a == 3)
    a++;

这些都没有执行,所以剩下的20

答案 2 :(得分:0)

不,他们不等同。因为第一个if之后将执行第二个if(),如果首先在内部更改了k,它可能会触发。 else if永远不会发生这种情况,因为else在第一次if被解雇时永远不会触发。