多重if不带else不等价于if else?c++

multiple if without else not equivalent to if else? c++

本文关键字:if else c++ 等价于 不等价 多重 不带      更新时间:2023-10-16

尝试按升序对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}时,第一个函数执行正确的排序,而第二个函数不执行任何操作。这里有什么区别?

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

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;
    }
}

而对于CCD_ 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一个块。它们都有可能不会执行,因为你没有最终的else语句来捕捉"其他一切"。所以,如果你有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++;

这些都不执行,所以a保持20

不,它们不等价。因为第二个if()将在第一个if之后执行,所以如果在第一个if内部更改了k,它可能会激发。else if永远不会发生这种情况,因为如果第一个if激发,else永远不会激发。