ホームページ  >  記事  >  システムチュートリアル  >  goto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?

goto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?

PHPz
PHPz転載
2024-02-05 13:25:271219ブラウズ

C 言語の goto ステートメントについては多くの議論があり、多くの書籍では「使用には注意するか、使用を避けること」が推奨されています。ただし、Linux の父である Linus の実践では、Linux で goto ステートメントが広く使用されており、この機能も私たちにこの機能を合理的に使用するきっかけを与えてくれました。

論争があるため、goto ステートメントの使用方法を学ぶ必要があります。 goto ステートメントの基本的な構文と例を見てみましょう:

1. gotoの基本構文

goto ステートメントは、キーワード goto とラベル名の 2 つの部分で構成されます。ラベルの命名規則は変数の命名規則と同じです。例: ### リーリー

このステートメントが正しく動作するには、関数に、次のように、ラベル名で始まり、その後にコロンが続く、label というラベルが付いた別のステートメントも含める必要があります。

label:printf(“ここに移動します。\n”);

2. goto

の例

左右にスワイプしてすべてのコードを表示>>>

リーリー 操作結果:

実行結果から、複数のループからジャンプできる goto の使用法が明らかにわかります。プログラムの実行中に goto ステートメントに遭遇すると、そのラベルにジャンプして実行を継続できます。 。 goto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?

注目に値する点は、goto ステートメントとそのジャンプ ラベルが同じ関数内に存在する必要があるということです。

3. goto、break、および continue の違いは何ですか?

これは Jump ステートメントでもありますが、goto ステートメントと Break および continue ステートメントの違いは何ですか?

実際には、break と continue は goto の特殊な形式です。 Break と continue を使用する利点は、それらの名前がす​​でにその使用法を示していることです。

コード例を通して、break と continue の使用法を見てみましょう:

1. ブレークテスト関数

上記のテスト プログラムを使用して、break ステートメント

void TestBreak(void);

をテストする関数を構築します。例:

左右にスワイプしてすべてのコードを表示>>>

リーリー 操作結果:

実行結果から、break が現在のループを終了できることが明らかにわかります。 goto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?

この例では、最初の Break ステートメントは現在の for ループを終了し、2 番目の Break ステートメントは現在の while ループを終了します。ブレークによってループを終了できることがわかります。

したがって、break と goto の特性によれば、多くのレベルのループから抜け出したい場合は、goto を使用する方が便利です。

2. テスト機能の続行

同様に、Continue ステートメント

void TestContinue(void);

をテストする関数を構築します。例:

左右にスワイプしてすべてのコードを表示>>>

リーリー 操作結果:

実行結果から、Continue によってこのループ (ループ全体ではなく) が終了し、次のループ (i はループの数を表します) に入ることができることが明らかです。 goto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?

四、支持与反对goto的理由是什么?

1、不提倡使用goto

不提倡使用goto的占比应该比较多,不提倡的原因主要是:很容易把逻辑弄乱且难以理解。

2、使用goto的理由

这一部分人认为goto可以用在以下两种情况比较方便:

(1)跳出多层循环。

这个例子就类似于我们上面的goto测试程序。

(2)异常处理。

一个函数的执行过程可能会产生很多种情况异常情况。下面有几种处理方式,以代码为例:

方法一:做出判断后,如果条件出错,直接return。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int count = 0;
   if (str == NULL)
   {
      return-1;
   }

   if (*str == 0)
   {
      return0;
   }

   while(*str != 0 )
   {
      count++;
      str++;
   }
   return count;
}

方法二:先设置一个变量,对变量赋值,只有一个return。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int ret;
   if (str == NULL)
   {
      ret = -1;
   }
   elseif (*str == 0)
   {
      ret = 0;
   }
   else
   {
      ret = 0;
      while(*str != 0 )
      {
         ret++;
         str++;
      }
   }
   return ret;
}

方法三:使用goto语句。

*左右滑动查看全部代码>>>*

int mystrlen(char *str)
{
   int ret;
   if (str == NULL)
   {
      ret = -1;
      goto _RET;
   }

   if (*str == 0)
   {
      ret = 0;
      goto _RET;
   }
       
   while(*str !=0 )
   {
      ret++;
      str++;
   }

_RET:
   return ret;
}

其中,方法三就是很多人都提倡的方式。统一用goto err跳转是最方便且效率最高的,从反汇编语句条数可以看出指令用的最少,消耗的寄存器也最少,效率无疑是最高的。

并且,使用goto可以使程序变得更加可扩展。当程序需要在错误处理时释放资源时,统一到goto处理最方便。这也是为什么很多大型项目,开源项目,包括Linux,都会大量的出现goto来处理错误!

以上がgoto は Linux カーネルで広く使用されているのに、多くの書籍でその使用が推奨されていないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。