如何在不使用break的情况下退出C++中的循环?

5
我正在编写一个可以在数组中交换整数的代码,我想知道如何在不使用break语句的情况下退出循环并保持我的逻辑一致。以下是我的代码:
int swapped = 0;
if (arrays[0][first] % 2 == 0)
{
     cout << arrays[0][first] << " is odd " << endl;
     for (int i = 1; i < arraycount; ++i)
     {
         for (int j = 1; j < arrays[i][0] + 1; ++j)
         {
             if (arrays[i][j] % 2 != 0)
             {
                  int temp = arrays[i][j];
                  cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with "
                          << "Array #" << i << " value " << temp;

                  arrays[i][j] = arrays[0][first];
                  arrays[0][first] = temp;
                  swapped = 1;
                  break;
              }
          }
          if (swapped) {
                break;
          }

2
break有什么问题吗? - David Heffernan
2
这是C++。为什么swapped是一个int,而它的作用却像一个bool - dureuill
可能是 for ( 初始值; 常规条件 && 跳出条件; 步进器) {...} - Emadpres
3个回答

4
for (int i = 1; i < arraycount && !swapped; ++i)
{
     for (int j = 1; j < arrays[i][0] + 1 && !swapped; ++j)
     {
        if(arrays[i][j] % 2 != 0)
          int temp = arrays[i][j];
          cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " << "Array #" << i << " value " << temp;
          arrays[i][j] = arrays[0][first];
          arrays[0][first] = temp;
          swapped = 1;
        }
     }
}

这将执行与内部循环相同的操作。


最初 int swapped = 0;,因此它不会进入第一个循环。 - Himanshu
在第二个循环中,它想要通过所有偶数,并对第一个奇数执行doSomethings,然后退出。但是在你的代码中,它对所有偶数执行doSometings,并且当找到第一个奇数时,它从循环中返回。 - Zhr Saghaie
@alsa,我非常重视您的评论,但我不确定我理解您在说什么? - user4580220
OP的代码和这里演示的代码并不做相同的事情,但是这个想法是适用的。 - Cem Kalyoncu
@GRC,在原始帖子的代码中,第二个循环会一直运行,直到第一个 if (arrays[i][j] % 2 != 0) 条件出现,然后就会跳出循环。但是在你的代码中,如果 arrays[i][j] % 2 != 0 条件不成立,则会跳过第二个循环。请修正此处。 - Himanshu
抱歉,我明白你们在谈论什么了,我的代码根本不会在循环内执行代码。谢谢 :) 现在已经很晚了,我今天过得很累,你们介意我明天解决这个问题吗? - user4580220

4
使用 goto [我会因此而受到责备]。
if (arrays[0][first] % 2 == 0)
{
     cout << arrays[0][first] << " is odd " << endl;
     for (int i = 1; i < arraycount; ++i)
     {
         for (int j = 1; j < arrays[i][0] + 1; ++j)
         {
             if (arrays[i][j] % 2 != 0)
             {
                  int temp = arrays[i][j];
                  cout << "Array #" << 1 << " value " 
                          << arrays[0][first] << " swapped with "
                          << "Array #" << i << " value " << temp;

                  arrays[i][j] = arrays[0][first];
                  arrays[0][first] = temp;
                  goto done;
              }
          }
done:
    something;

1
在现代C++中,多级跳出语句是我认为goto的主要用例之一。 - user1084944

2
使用Break语句并不一定会使您的代码逻辑不一致,而且Break通常有助于提高代码的可读性。但是,为了回答您的问题,可以利用while循环和逻辑布尔运算符来实现这一点。下面是修改后的代码版本,我尽量少修改,以便您仍然可以在示例中看到自己的代码。下面的示例中有一些逻辑错误,您可能需要查找。特别是下面这行代码将在数字实际上是偶数时打印“是奇数”。如果您想检查数字arrays [0] [first]是否为奇数,则需要使用以下if语句:if(arrays [0] [first]%2!= 0)而不是if(arrays [0] [first]%2 == 0)

逻辑错误

if (arrays[0][first] % 2 == 0)
            {
                    cout << arrays[0][first] << " is odd " << endl;

这是不使用break语句的代码。

bool swapped = true;
            if (arrays[0][first] % 2 == 0)
            {
                    cout << arrays[0][first] << " is odd " << endl;
                    int i = 1;
                    while ( (i < arraycount) && swapped)
                    {
                            int j = 1;
                            bool if_odd = true;
                            while ((j < arrays[i][0] + 1) && if_odd)
                            {
                                    if (arrays[i][j] % 2 != 0)
                                    {
                                            int temp = arrays[i][j];
                                            cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with "
                                                    << "Array #" << i << " value " << temp;

                                            arrays[i][j] = arrays[0][first];
                                            arrays[0][first] = temp;
                                            swapped = false;
                                            if_odd = false;
                                    }
                                    j++;
                            }
                            i++;
                    }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接