آموزش ساختار goto در C++ (به زبان کاملا ساده)
در این آموزش ساختار goto ، نحوه ی کار و اینکه چرا باید از استفاده آن اجتناب کرد را می آموزید.
در برنامه نویسی C++ از goto برای تغییر در ترتیب اجرای برنامه و انتقال از یک قسمت به قسمت دیگر کد استفاده می شود.
ساختار goto در C++
goto label;
… .. …
… .. …
… .. …
label:
statement;
… .. …
در ساختار بالا، label علامت است. وقتی که برنامه با goto label; مواجه می شود، کنترل برنامه به label می پرد و ادامه کد از آن جا اجرا می شود.
مثال : goto در C++
- // This program calculates the average of numbers entered by user.
- // If user enters negative number, it ignores the number and
- // calculates the average of number entered before it.
- # include
- using namespace std;
- int main()
- {
- float num, average, sum = 0.0;
- int i, n;
- cout << “Maximum number of inputs: “;
- cin >> n;
- for(i = 1; i <= n; ++i)
- {
- cout << “Enter n” << i << “: “;
- cin >> num;
- if(num < 0.0)
- {
- // Control of the program move to jump:
- goto jump;
- }
- sum += num;
- }
- jump:
- average = sum / (i – 1);
- cout << “nAverage = ” << average;
- return 0;
- }
خروجی
Maximum number of inputs: 10
Enter n1: 2.3
Enter n2: 5.6
Enter n3: -5.6
Average = 3.95
می توانید هر برنامه C++ را بدون استفاده از goto بنویسید.
دلایل پرهیز از استفاده goto
goto به ما این امکان را می دهد که از هر نقطه به نقطه ی دیگری در کد پرش کنیم اما منطق برنامه پیچیده و تو در تو خواهد شد.
در برنامه نویسی مدرن، goto ساختار مضری در نظر گرفته می شود.
به جای goto می توان از break و continue در C++ استفاده کرد.
نکات مهم در استفاده از goto
همانطور که گفته شد، گرچه استفاده از `goto` در برنامهنویسی مدرن به دلیل مشکلاتی که در خوانایی و نگهداری کد ایجاد میکند توصیه نمیشود، اما درک نحوه استفاده از آن میتواند مفید باشد. در زیر به نکات مهم مربوط به ساختار `goto` در C++ اشاره میشود:
تعریف و استفاده از برچسب:
برچسبها با یک نام که با حروف الفبا شروع میشود تعریف میشوند و باید با یک علامت دونقطه (:) ختم شوند.
برچسبها میتوانند در هر جایی از تابع تعریف شوند، حتی قبل از دستور `goto` که به آنها اشاره میکند.
#include <iostream>
using namespace std;
int main() {
int i = 0;
start: // تعریف برچسب
cout << i << " ";
i++;
if (i < 5) {
goto start; // استفاده از دستور goto
}
cout << "End of loop" << endl;
return 0;
}
کاربردهای مناسب `goto`:
برای خروج از چند حلقه تودرتو:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (someCondition) {
goto exitLoops; // خروج از دو حلقه
}
}
}
exitLoops:
cout << "Exited loops." << endl;
مشکلات استفاده از `goto`:
کاهش خوانایی کد: استفاده از `goto` میتواند کد را پیچیده و غیرقابل خواندن کند.
افزایش احتمال بروز خطا: ردیابی جریان کنترل برنامه و خطاها در برنامههایی که از `goto` استفاده میکنند دشوارتر است.
کد غیر ساختیافته: استفاده از `goto` ساختارهای کنترلی استاندارد مانند حلقهها و شرطها را نادیده میگیرد و باعث ایجاد کد غیر ساختیافته میشود.
جایگزینهای مناسب برای `goto`:
حلقهها و شرطها: در بیشتر مواقع، میتوان از حلقههای `for`، `while` و دستورات شرطی `if`، `else` استفاده کرد.
توابع و بازگشت: استفاده از توابع و بازگشت میتواند به مدیریت بهتر جریان کنترل و تقسیم برنامه به بخشهای کوچکتر و قابل فهمتر کمک کند.
استفاده از استثناها: در مواقعی که نیاز به خروج از چندین سطح تودرتو دارید، استفاده از استثناها (Exceptions) میتواند جایگزین مناسبی باشد.
به طور کلی، استفاده از `goto` باید با دقت و فقط در موارد خاص انجام شود. برنامهنویسان باید تلاش کنند از ساختارهای کنترلی استاندارد و تکنیکهای مدرن برنامهنویسی استفاده کنند تا کدهای خواناتر و قابل نگهداریتری تولید کنند.