Cấu trúc lặp Goto trong C#.

Khóa học lập trình C# căn bản

4.5 (4 đánh giá)
Tạo bởi Trần Thành Vi Thanh Cập nhật lần cuối 12:37 20-07-2020 96.531 lượt xem 20 bình luận
Tác giả/Dịch giả: Trần Thành Vi Thanh
Học nhanh

Danh sách bài học

Cấu trúc lặp Goto trong C#.

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về CẤU TRÚC CƠ BẢN CỦA VÒNG LẶP. Ở bài này chúng ta sẽ cùng đi sâu vào chi tiết cách sử dụng vòng lặp goto

Khuyến cáo không sử dụng Goto trong ngôn ngữ C#


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Cấu trúc của một vòng lặp goto
  • Các ví dụ sử dụng goto

Cấu trúc của một vòng lặp goto

Cái tên goto có thể hiểu là đi đến đâu đó. Thường sử dụng cấu trúc goto người ta sẽ đi kèm một câu điều kiện (có thể không cần).

Cấu trúc:

goto <label>;

  • Trong đó label là một nhãn đích đến trong code. Nơi mà code sẽ tiếp tục được thực thi từ đó. Cấu trúc của một label: <Tên label>:
  • goto là từ khóa thông báo cho trình biên dịch biết sẽ đi đến nhãn ngay sau để tiếp tục thực thi code.

Các ví dụ sử dụng goto:

static void Main(string[] args)
        {
            int a = 1;
            switch(a)
            {
                case 1:             // label case 1
                    Console.WriteLine("Case 1");
                    break;
                case 2:             // label case 2
                    Console.WriteLine("Case 2");
                    goto case 1;    // dịch chuyển tới label case 1
                    break;          // Đoạn code này thừa vì sẽ không bao giờ thực thi
                case 3:             // label case 3
                    Console.WriteLine("Case 3");
                    break;
            }
     Console.ReadKey();
       } 
  • Trong đoạn code này chúng ta biên dịch sẽ thấy kết quả xuất ra màn hình dòng chữ "Case 1" vì a == 1.

Cấu trúc lặp Goto trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

  • Giờ chúng ta thay giá trị a = 2 xem kết quả ra sao nhé
static void Main(string[] args)
        {
            int a = 2;
            switch(a)
            {
                case 1:             // label case 1
                    Console.WriteLine("Case 1");
                    break;
                case 2:             // label case 2
                    Console.WriteLine("Case 2");
                    goto case 1;    // dịch chuyển tới label case 1
                    break;          // Đoạn code này thừa vì sẽ không bao giờ thực thi
                case 3:             // label case 3
                    Console.WriteLine("Case 3");
                    break;
            }
            Console.ReadKey();
        }
 
  • Kết quả:

Cấu trúc lặp Goto trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

Ta thấy chương trình đi vào case 2 sau đó gặp dòng code goto case 1; nên đã nhảy lên thực thi dòng code

case 1:             // label case 1
Console.WriteLine("Case 1");
break;

rồi mới kết thúc chương trình.

Một ví dụ khác kết hợp với câu điều kiện:

static void Main(string[] args)
        {
            int a = 1;
            // nếu a == 2
            if (a == 2)
            {
                // dịch chuyển tới vị trí label a_Is_2
                goto a_Is_2;
            }

            Console.WriteLine("A == 1");
            a_Is_2:
            Console.WriteLine("A == 2");

            Console.ReadKey();
        }
 
  • Ở trường hợp này  kết quả màn hình sẽ xuất ra dòng chữ "A == 1" và dòng chữ "A == 2" ra màn hình.

Cấu trúc lặp Goto trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

Chúng ta có thể nhận thấy 2 điều ở ví dụ này:

label có thể được tạo ra một cách dễ dàng và không nhất thiết phải nằm trong cấu trúc switch.

Việc tạo label sẽ không ảnh hưởng gì đến code thông thường.

Chúng ta thử cho giá trị của a = 2 và xem kết quả nhé:

static void Main(string[] args)
        {
            int a = 2;
            // nếu a == 2
            if (a == 2)
            {
                // dịch chuyển tới vị trí label a_Is_2
                goto a_Is_2;
            }

            Console.WriteLine("A == 1");
            a_Is_2:
            Console.WriteLine("A == 2");

            Console.ReadKey();
        }
  • Kết quả sẽ in ra màn hình dòng chữ "A == 2". Dòng chữ "A == 1" không được in ra do đoạn code Console.WriteLine("A == 1"); bị bỏ qua vì câu lệnh goto dịch chuyển đến label a_Is_2: nằm bên dưới nó.

Cấu trúc lặp Goto trong C#, C# cơ bản, tự học C#, Kteam, HowKteam

Vậy rõ ràng lần này chương trình không đi theo trình tự từ trên xuống dưới mà bị dịch chuyển ngược lên trên trở lại bởi câu lệnh goto.

Bản chất của gotonhảy đến bất cứ nơi đâu có label. Mọi câu lệnh khác khi goto bỏ qua đều bị trình biên dịch bỏ qua.

Ví dụ về vòng lặp vô tận:

Chỉ cần câu điều kiện lặp luôn thỏa mãn thì vòng lặp sẽ lặp mãi.

static void Main(string[] args)
        {
            int a = 2;

            Ifinity_Loop:
            // nếu a == 2
            if (a == 2)
            {
                // dịch chuyển tới vị trí label a_Is_2
                goto a_Is_2;
            }

            Console.WriteLine("A == 1");
            a_Is_2:
            Console.WriteLine("A == 2");
            goto Ifinity_Loop; // dịch chuyển tới vị trí label Ifinity_Loop

            Console.ReadKey();
        }

Chúng ta thấy khi chạy chương trình sẽ in ra hàng loạt dòng "A == 2" do đoạn code Console.WriteLine("A == 2"); được lặp lại liên tục. Đoạn code làm phát sinh vấn đề này là ở đây:

  •  Ban đầu chương trình sẽ đi đến đoạn code goto a_Is_2;.
  •  Sau đó lại bị đoạn code goto Ifinity_Loop; đưa ngược lại label Ifinity_Loop.
  •  Mãi không thể nào kết thúc quá trình lặp lại này dẫn đến một vòng lặp vô tận.


Kết luận

Qua bài này chúng ta đã nắm được cách sử dụng gotolabel. Đây là một cấu trúc được khuyến cáo là hạn chế sử dụng (không dùng thì tốt hơn) trong lập trình C# vì nó có thể phá vỡ cấu trúc của một chương trình (đi từ trên xuống).

Bài sau chúng ta sẽ tiếp tục tìm hiểu về cấu trúc lặp tiếp theo đó là CẤU TRÚC VÒNG LẶP FOR TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Cấu trúc lặp Goto trong C#. dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Mỗi buổi sáng thức dậy, bạn có 2 lựa chọn, tiếp tục ngủ để mơ những giấc mơ hoặc thức dậy và theo đuổi chúng!

Khóa học

Khóa học lập trình C# căn bản

Bạn mới bắt đầu học lập trình? Bạn đang muốn học thêm ngôn ngữ lập trình mới? C# là lựa chọn hoàn hảo để đáp ứng các nhu cầu trên.

Ngôn ngữ C# là một ngôn ngữ mới, cấu trúc rõ ràng, dễ hiểu và dễ học. C# thừa hưởng những ưu việt từ ngôn ngữ Java, C, C++ cũng như khắc phục được những hạn chế của các ngôn ngữ này. C# là ngôn ngữ lập trình hướng đối tượng được phát triển bởi Microsoft, được xây dựng dựa trên C++ và Java.

Khoá học lần này sẽ mang đến toàn bộ những kiến thức cơ bản về C#. Chào mừng các bạn đã đến với khoá học LẬP TRÌNH C# CƠ BẢN của Kteam.

Đánh giá

TomSon Viera đã đánh giá 14:25 11-01-2024

Cá nhân mình có nền tảng lập trình rồi nhưng cũng thấy khá khoai mỗi bài giảng, mình ghĩ không có nền tảng sẽ khó tiếp thu khóa C#, nên giảng vị dụ trực tiếp tự code ra thay vì kiến thức đọc liệu

King đã đánh giá 17:27 22-08-2021

Masterboy1103 đã đánh giá 10:39 21-07-2020

Nhàn đã đánh giá 11:25 18-01-2020

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
thanhle47390 đã bình luận 13:20 28-10-2023

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("***********************************************");
            Console.WriteLine("******CHUONG TRINH LAP LAI CAU BAN MUON******");
            Console.WriteLine("***********************************************");

            
            string A;
            Console.WriteLine("Moi ban nhap cai can lap lai: ");
            A = Console.ReadLine();
            int B ;
            Console.WriteLine("Moi ban nhap so lan muon lap lai: ");
            B = Convert.ToInt32(Console.ReadLine());
            int C = 0;
         Beginloop:
            Console.WriteLine(A);
         C++;
         if (C < B)
             goto Beginloop;
         Console.WriteLine("End");

 

 

            Console.ReadKey();
        }
    }
}

 

hoangtruonghd88 đã bình luận 16:33 30-09-2023

Hay và ý nghĩa, cách truyền đạt đúng chuẩn cơm mẹ nấu luôn, nghe bài giảng rất cuốn hút

Nguyencongck đã bình luận 11:25 15-10-2022

Thêm 1 câu hỏi nữa là nếu không sử dụng goto thì sử dụng gì để di chuyển thẳng đến vị trí ( chức năng ) mình muốn trong chương trình . Bỏ qua các vị trí / chức năng mình không mong muốn . 

Cảm ơn

Nguyencongck đã bình luận 11:19 15-10-2022

Cho mình hỏi là cấu trúc goto ở trong 1 hàm phụ , và hàm phụ này ở trong hàm main . 

vậy thì có thể sử dụng goto để đến 1 label không nằm ở trong hàm phụ mà nằm ở trong hàm main được không ? 

Khi mình viết goto label ở ngoài hàm đang chứa goto thì hiện lỗi CS0159 . 

Bạn nào biết giải thích giúp mình với . mình cảm ơn

kien88 đã bình luận 16:50 09-08-2022

Luyện tập – Thử thách – Không ngại khó” ở đâu vậy ạ

 

Không có video.