Xin chào và chào mừng. Trong bài giảng này, tôi muốn nói về câu lệnh switch.
Nó là một thay thế cho câu lệnh
if, nhưng thường chỉ được sử dụng trong các tình huống cụ thể.
Nhưng nó có một số cú pháp tuyệt vời để thực hiện một số lặp lại trong câu lệnh if của bạn.
Vì vậy, toán tử điều kiện và câu lệnh if than else
giúp bạn dễ dàng viết các chương trình lựa chọn giữa hai phương án.
Rất dễ dàng để đặt câu hỏi và đưa ra quyết định.
Tuy nhiên, nhiều khi, một
chương trình cần phải chọn một trong nhiều lựa chọn thay thế.
Và đây về cơ
bản sẽ là if else if else if else if else if.
Thật là lộn xộn vì bạn rõ ràng có thể triển khai điều này với câu lệnh if khi
bạn có một số lựa chọn thay
thế, nhưng bạn có thể có hàng trăm ifs khác. Vì vậy, nó tẻ nhạt, nó dễ xảy ra sai sót, và
nó thực sự chỉ là một cơn đau ở mông. Nó giống như viết một loạt mã soạn sẵn.
Vì vậy, giải pháp thay thế cho cú pháp này và mọi thứ bạn có
thể làm trong chuyển đổi mà bạn có thể làm trong if.
Nhưng nó sạch hơn, dễ sử dụng hơn và thực sự cũng hiệu quả hơn rất nhiều.
Vì vậy, khi giá trị của một biến được so sánh thành công với các giá trị khác nhau, hãy sử
dụng câu lệnh switch.
Và điều này có nghĩa là gì nếu bạn có câu lệnh if và sau đó bạn có câu lệnh else if, else if,
else if, else if, else if, else if, sử dụng câu lệnh switch.
Bây giờ nếu các biểu thức Boolean đó phức tạp hơn một chút.
Bạn không thể sử dụng câu lệnh chuyển đổi. Bạn chỉ có thể
sử dụng câu lệnh switch khi so sánh với một giá trị, chẳng hạn như một hằng số.
Biểu thức không thể phức tạp như vậy.
Nhưng sẽ thuận tiện hơn nhiều và rất hiệu quả khi sử dụng câu lệnh switch, và hầu hết
các ngôn ngữ đều có cấu trúc này. Và thấy nó rất đẹp. Một điều bạn nhận thấy
là rất nhiều ngôn ngữ sẽ xây dựng dựa trên c.
Nếu bạn đã lập trình trước khi
bạn sẽ thấy và quen thuộc với rất nhiều cấu
trúc này bởi vì chúng ban đầu xuất hiện bằng ngôn ngữ c hoặc be, trước đó.
Vì vậy, đây là cú pháp của một câu lệnh switch. Bạn có từ khóa chuyển đổi.
Và bên trong công tắc, bạn có dấu ngoặc đơn trái và
phải, đó là biểu thức. Vì vậy, nó trông giống như câu lệnh
if ở đầu ngoại trừ thay vì từ khóa if, bạn có từ khóa switch.
Sau đó, bạn có dấu ngoặc vuông bên trái.
Dấu ngoặc trái bắt buộc. Dấu ngoặc bên trái đó bắt đầu phần thân của công tắc.
Và bạn thấy dấu ngoặc phải kết thúc ở phía dưới cùng, kết thúc phần thân của công tắc.
Điều quan trọng khác ở đây là những từ khóa này là trường hợp.
Trường hợp thực sự giống như
câu lệnh if. Vì vậy, switch thực sự
sẽ xem xét một biểu thức, không cần biết
nó có nhất thiết phải đúng hay sai hay không.
Việc chuyển đổi có thể chỉ là nhìn vào một biến hoặc một cái gì đó.
Và sau đó nó sẽ đánh giá biến đó trong các câu lệnh trường hợp.
Vì vậy, nếu giá trị 1 bằng biểu thức,
nếu giá trị n bằng biểu thức.
Nhưng bạn có thể xem điều này giống
như công tắc đang ở cấp cao nhất và sau đó mỗi trường hợp là một câu
lệnh if, so sánh các giá trị với các biểu thức trong công tắc.
Vì vậy, các trường hợp cũng là từ khóa. Bạn cũng nhận thấy dấu hai chấm sau trường hợp.
Vì vậy, bạn có trường hợp và sau đó bạn có giá trị của mình.
Và bên trong đó, bạn có thể có nhiều câu lệnh chương trình.
Và cuối cùng, bạn có một từ khóa break. Đó là một từ khóa khác. Vì vậy, có ba từ
khóa ở đây, thực tế là bốn. Có từ khóa chuyển đổi, từ khóa trường hợp, từ khóa break và sau
đó là từ khóa mặc định ở dưới cùng.
Vì vậy, đây là những điều quan trọng cần lưu ý. Chúng tôi sẽ đi qua một ví dụ
chi tiết, nhưng bạn có thể có các trường hợp khác nhau. Và một lần nữa, điều này giống như một if else, if else, if else, else if.
Vì vậy, nếu giá trị một là biểu thức bằng nhau, hãy thực thi mã.
Nếu giá trị hai bằng biểu thức, hãy
đánh giá điều đó. Nếu giá trị ba bằng biểu thức, hãy đánh giá điều đó.
Nếu giá trị n bằng biểu thức, hãy thực thi mã bên trong khối đó.
Và khối cho các trường hợp bắt đầu bằng dấu hai chấm và kết thúc bằng dấu ngắt.
Và nếu bạn không có sự phá vỡ đó ở đó,
nó sẽ rơi vào các trường hợp khác. Chúng ta sẽ nói về điều đó một lần nữa.
Và điều quan trọng cuối cùng ở đây là từ khóa mặc định này. Về cơ bản, đây là cái khác,
khác nếu, khác nếu, khác nếu và sau đó khác ở dưới cùng.
Vì vậy, điều này được đặt nếu không có trường hợp nào khác đánh giá biểu thức.
Vì vậy, hãy nói về một số chi tiết mà tôi đã đề cập.
Biểu thức nằm trong dấu ngoặc đơn được so sánh thành công với các giá trị.
Vì vậy, một
lần nữa, nếu chúng ta quay lại cú pháp, biểu thức được so sánh với tất cả các giá trị.
Và nếu nó tương đương với bất kỳ giá trị nào, bạn thực thi mã bên trong giá trị đó.
Các trường hợp phải là hằng số đơn giản hoặc biểu thức hằng, biểu
thức đánh giá thành một hằng số.
Vì vậy, bạn có thể bật x cộng với y
vì nếu x là 5 sẽ chỉ chuyển sang 10 và nó sẽ so sánh các giá trị với 10.
Nhưng thông thường, bạn bật một biến bằng một số loại số.
Nếu một trường hợp được tìm thấy có giá trị bằng giá trị của biểu thức, thì
các câu lệnh theo sau trường hợp đó được thực thi.
Khi có nhiều hơn một câu lệnh, chúng không cần phải được đóng lại trong dấu ngoặc nhọn.
Vì vậy, đó chỉ là nói rằng
khi nhiều hơn một câu lệnh được bao gồm, không
cần dấu ngoặc nhọn cho các câu lệnh trường hợp.
Hãy nhớ rằng, đối với câu lệnh if, chúng ta sẽ luôn phải
có những dấu ngoặc nhọn đó, không phải vậy đâu. Bạn chỉ có thể đặt chúng hết dòng này đến dòng khác, mấu chốt là điểm ngắt ở đó.
Câu lệnh break báo hiệu sự kết thúc của trường hợp cụ
thể và làm cho việc thực hiện câu lệnh bị kết thúc,
nó nhảy ra ngoài.
Nếu bạn không có thời gian nghỉ ở đó, trường hợp tiếp theo nó sẽ rơi vào.
Vì vậy, bạn muốn bao gồm kết thúc câu lệnh break trong mọi trường hợp. Khi bạn không bao gồm thời gian nghỉ, điều đó
thường có nghĩa là có lỗi hoặc thứ gì đó.
Lý do duy nhất bạn muốn bao gồm ngắt là nếu bạn có nhiều điều
kiện mà bạn muốn thực thi mã. Vì vậy, nếu bạn có nhiều trường
hợp, về cơ bản nói nếu biểu thức
là trường hợp này, trường hợp này hoặc trường hợp kia, sau
đó làm điều tương
tự, sau đó bạn sẽ nghỉ.
Vì vậy, hãy cẩn thận với các ngắt vì ngắt có thể gây ra sự cố
cho dù các khối nhất định có đang được thực thi trong trường hợp tiếp theo hay không.
Trường hợp tùy chọn đặc biệt được gọi là mặc định được thực thi nếu giá trị
của biểu thức không khớp với bất kỳ trường hợp nào. Nó cũng giống như một cú ngã khác, nó sẽ xảy ra
nếu không có trường hợp nào là đúng.
Vì vậy, đây là một ví dụ hay, nơi chúng tôi đang tạo một công tắc để đánh giá một enum.
Trong trường hợp này, chúng ta có một kiểu enum được gọi là ngày trong tuần, kiểu
này chỉ được chỉ định bởi tất cả các ngày trong tuần.
Và sau đó chúng tôi tạo một biến kiểu enum weekday và chúng tôi đặt nó thành Thứ Hai và sau đó chúng
tôi chuyển sang ngày hôm nay.
Vì vậy, tùy thuộc vào giá trị của ngày hôm nay, biến, một trong
các câu lệnh trường hợp sẽ được thực thi.
Nếu hôm nay là chủ nhật, nó sẽ in ra hôm nay là
chủ nhật và sau đó nhảy ra.
Nếu ngày hôm nay bằng thứ Hai, nó sẽ được in ra hôm nay là thứ Hai và nhảy ra ngoài.
Nếu nó không bằng bất kỳ cái nào trong
số chúng, nó sẽ chuyển sang trường hợp mặc định. Vì vậy, hãy chạy qua ví dụ này trong các khối mã.
Ở đây chúng tôi có mã mẫu của chúng tôi. Và bạn sẽ thấy điều đó bởi vì hôm
nay bằng với thứ Hai, trường hợp thứ
Hai sẽ được đánh giá và bạn sẽ thấy kết quả hôm nay là thứ Hai.
Vì vậy, hãy tiếp tục và xây dựng mã này và chạy nó. Và đó là những gì chúng ta sẽ thấy, hôm
nay là thứ Hai.
Bởi vì những gì đang xảy ra ở đây là hôm nay sẽ là thứ Hai. Bạn đặt biểu thức này là
biểu thức bạn muốn đánh giá biến ngày hôm nay sau đó đánh giá nó.
Điều quan trọng cần nhớ ở đây là bạn
có một dấu ngoặc để bắt đầu câu lệnh switch trên dòng 16 trong
một dấu ngoặc kết thúc để kết thúc tên switch ở dòng 29.
Bạn có thể có nhiều dòng bên trong mỗi câu lệnh trường hợp mà không cần sử dụng dấu ngoặc.
Bây giờ chúng ta hãy xem điều gì sẽ xảy ra nếu
chúng ta đưa ra tuyên bố nghỉ sau thứ Hai.
Bởi vì hãy nhớ rằng, break sẽ nhảy ngay ra khỏi vỏ máy. Nhưng nếu chúng tôi loại
bỏ nó, điều sẽ xảy ra là nó
sẽ rơi vào thứ Ba và bạn sẽ thấy cả hai bản in được
thực thi cho thứ Hai hôm nay và hôm nay là thứ Ba.
Vì vậy, bây giờ khi chúng ta chạy chương
trình, chúng ta thấy hôm nay là thứ hai, hôm nay là thứ ba.
Đó là tầm quan trọng của câu lệnh break.
Đoạn nghỉ nhảy ra ngoài.
Vì vậy, điều này có thể hữu ích nếu bạn muốn cùng một đầu ra cho Thứ Hai và Thứ Ba.
Vì vậy, ví dụ, đôi khi bạn sẽ thấy các
câu lệnh như thế này, trường hợp thứ ba bởi vì bạn muốn có cùng một
đầu ra và biến đó bằng với giá trị nào không quan trọng.
Vì vậy, bạn có thể thấy những thứ như vậy, nhưng khi bạn có các câu lệnh trường
hợp riêng biệt có cách thực thi khác nhau, bạn phải thêm dấu ngắt đó vào đó.
Vì vậy, chúng tôi chỉ xem xét Chủ Nhật, Thứ Hai và Thứ Ba.
Điều gì sẽ xảy ra nếu chúng ta đặt giá trị ngày hôm nay bằng ngày Chủ
nhật vì không có trường hợp nào khớp với giá trị đó.
Chà, những gì sắp xảy ra là nó sẽ rơi vào trạng thái mặc định và nó sẽ in ra bất cứ thứ gì.
Vì vậy, hãy thử chạy lại.
Và chúng ta thấy hôm nay là Chủ nhật.
Xin lỗi, đặt nó thành biến sai. Tôi muốn đặt nó thành, giả
sử là Thứ Tư. Chúng tôi đã có một trường hợp cho Chủ nhật.
Vì vậy, bây giờ chúng ta sẽ thấy rằng nó thực sự in ra bất cứ thứ gì vì nó
không khớp với bất kỳ trường hợp nào.
Vì vậy, tất cả những gì bạn phải làm để chuyển đổi là thực sự ghi nhớ cú pháp.
Biểu thức được đặt trong dấu ngoặc đơn, đó là những gì bạn sẽ đánh giá.
Các trường hợp phải phù hợp với biểu thức. Vì vậy, thông thường, bạn đang thực hiện các biến, đó là
lý do tại sao nó phải là hằng số hoặc biểu thức đánh giá một giá trị hằng số cụ thể.
Và sau đó bạn có các trường hợp cho mỗi thứ và sau đó là một trường hợp mặc định cho tất cả các trường hợp, và đừng quên về các khoảng nghỉ.
Hãy quay lại và nói một chút và một ví dụ khác về cấu trúc
switch với các trường hợp.
Trong ví dụ tiếp theo này, nó hơi khác một chút.
Những gì chúng tôi đang làm ở đây là chúng tôi lấy dữ liệu từ người dùng và sau đó chuyển sang dữ liệu đó.
Vì vậy, trong ví dụ này trong hàm main của chúng ta, nó bắt đầu
tạo một cặp float và sau đó nó tạo một toán tử ký tự và sau đó nó yêu cầu người
dùng nhập một giá trị, một toán tử và một giá trị thứ hai.
Và nó sử dụng các mã định dạng để phân biệt và tất cả chúng đều có địa chỉ là dấu và.
Tùy thuộc vào ký tự bạn nhập cho toán tử, cho dù đó là dấu cộng hoặc dấu sao, đó là những
gì bạn muốn đưa vào trường hợp chuyển đổi của mình.
Vì vậy, nếu người dùng nhập một dấu cộng,
vì vậy bạn sẽ thấy trong cột tiếp theo ở đây, cấu trúc chuyển đổi, nó đang bật toán tử.
Nó sẽ so sánh giá trị của toán tử, giá trị của toán tử biến với mỗi một
trong các câu lệnh trường hợp này. Và bạn sẽ nhận thấy rằng các câu lệnh trường hợp
này có các dấu ngoặc kép xung quanh chúng bởi vì chúng tôi đang so sánh các ký tự.
Vì vậy, bạn có thể so
sánh các số, biến với giá trị hằng số cụ thể hoặc ký tự với hằng số cụ thể.
Và sau đó bên trong mỗi câu lệnh trường hợp, chúng tôi đang in ra một định dạng cụ thể.
Giá trị một cộng với giá trị hai, giá trị một trừ giá trị hai.
Chúng tôi thực sự đang thực hiện tính toán trong bản in của chúng tôi.
Và sau đó, bạn lại thấy những tuyên bố ngắt quãng quan trọng
đó đang nhảy ra ngoài và chúng cần thiết nếu bạn không muốn rơi vào bất kỳ trường hợp nào khác.
Bạn cũng lưu ý rằng trong câu lệnh trường hợp cuối cùng mà nó có dấu gạch chéo lên phía trước của dấu phân cách, chúng
ta có một câu lệnh if.
Chúng tôi không có bất kỳ dấu ngoặc nào xung quanh trường
hợp vì chúng tôi có thể có nhiều câu lệnh trong mỗi trường hợp mà không có dấu ngoặc.
Vì vậy, trường hợp cuối cùng chúng tôi nói nếu giá trị hai bằng 0, chúng tôi đang
thực hiện một kiểm tra nhỏ để đảm bảo rằng chúng tôi không chia cho 0.
Và nếu chúng ta không chia cho 0, thì chúng ta sẽ thực sự thực hiện phép chia của mình.
Và sau đó vào cuối vụ án đó, chúng tôi có một sự đổ vỡ khác.
Trường hợp mặc định của chúng tôi là bạn đã nhập một toán tử mà chúng tôi không biết cách xử lý.
Nhưng câu lệnh switch rất hiệu quả.
Viết rất nhanh bất cứ khi nào bạn so sánh nhiều
giá trị khác nhau với một biến cụ thể và sau đó bạn muốn làm những việc khác nhau.
Điều cuối cùng tôi muốn đề cập là tuyên bố đi đến liên quan đến việc ra quyết định.
Nó không phải là một tuyên bố
quyết định trực tiếp, nó thiên về chuyển sang một dòng mã khác, sử dụng một nhãn, nhưng nó
có sẵn trong c, và đó là lý do tại sao tôi muốn đề cập đến nó.
Có hai phần cho câu lệnh go to, nhãn và từ khóa go to.
Bây giờ đối với những người bạn đã lập trình trước
đây bằng Fortran hoặc một số ngôn ngữ cơ bản khác, có lẽ bạn sẽ nhận ra điều này và có
thể bạn đã sử dụng nó khá nhiều.
Bây giờ đến c, không cần thiết phải sử
dụng nó thực sự. Có một vài trường hợp mà
tôi thấy nó khá hữu ích, mà tôi sẽ giải thích trong giây lát, nhưng bước tiếp theo là nhảy ra một
số mã và bạn có thể đi tới bất kỳ dòng mã nào.
Một trong những lý do khiến mọi người không thích sử dụng nó vì nó rất khó theo dõi.
Khi bạn đang duy trì một chương trình và nếu nó tuần tự, bạn đang thực hiện từng
dòng một, các câu lệnh if trong vòng lặp while.
Thật tệ khi bạn có câu lệnh if trong vòng lặp while.
Nhưng bây giờ nếu bạn có thứ gì đó mà về cơ bản, bạn đang ở dòng 27
của mã nguồn và bạn sẽ chuyển đến dòng 800 không vì lý do gì khác ngoài việc chuyển đến từ khóa, đột
nhiên bạn đang bỏ qua hàng tấn mã, và rất khó để duy trì và làm theo.
Vì vậy, hai phần đi đến và tên nhãn. Nhãn được đặt tên theo cùng
một quy ước đặt tên biến, các ký tự chữ và số, bạn không thể bắt đầu bằng
chữ số, bạn có thể bắt đầu bằng dấu gạch dưới.
bạn có thể bắt đầu bằng dấu gạch dưới.
Về cơ bản, bạn chỉ cần sử dụng từ khóa go to và bạn đi đến một
số định danh, phần hai. Phần hai là nhãn ở đâu đó.
Vì vậy, để thực sự chuyển đến dòng mã đó, bạn phải gắn nhãn cho dòng mã đó.
Phải có một tuyên bố nói rằng phần hai.
Bây giờ tôi sẽ chỉ cho bạn một ví dụ về điều này, nhưng bạn thực sự không bao
giờ nên sử dụng nó vì các vấn đề liên quan đến bảo trì.
Tuy nhiên, tôi muốn đề cập đến nó nếu bạn đã lập trình trước đó và bạn đã quen với việc sử dụng nó.
Trong c, bạn không thực sự cần sử dụng nó nhiều.
Có một trường hợp sử dụng mà tôi thấy có thể hữu ích.
Một ngày nọ, tôi đang làm việc với một lập trình viên khác và
anh ta có một loạt các vòng lặp lồng nhau hoặc
các câu lệnh if lồng nhau.
Nhưng các vòng lặp thực sự có lẽ là ví dụ tốt hơn. Vòng lặp, ghi nhớ, lặp lại mã. Anh ta có rất nhiều vòng lặp lồng vào nhau.
Và ở vòng lặp lồng nhau bên trong, như vòng thứ năm, anh ta
muốn nhảy ra khỏi tất cả các vòng vì anh ta có một số điều kiện.
Và vì vậy anh ấy đã từng đi đến để nhảy ra khỏi tất cả những vòng lặp đó.
Bây giờ, một cách khác để nhảy ra khỏi vòng là sử dụng
từ khóa phanh, nhưng phanh sẽ chỉ nhảy ra khỏi vòng trong nhất.
Vì vậy, thực sự không có cách nào hiệu quả nếu không có anh ta đặt
ra một loạt các cờ và có một loạt các câu lệnh if để thoát khỏi mọi vòng
lặp, vì vậy anh ta thường sử dụng. Và đó là một trường hợp mà tôi nghĩ rằng
nó khá hữu ích vì nó làm giảm số lượng mã mà bạn phải viết và nó khá rõ ràng về những gì đang xảy ra.
Bạn vừa nhảy ra khỏi tất cả các vòng lồng nhau bởi vì bạn
đáp ứng một điều kiện nhất định.
Và đó là một trường hợp. Nhưng phần lớn, bạn không thực sự cần phải truy cập và
vì những lý do tôi đã đề cập, nó rất có vấn đề, thật khó để theo dõi mã khi bạn đang nhảy khắp nơi.
Nhưng việc đi đến cũng giống như bạn sử dụng nó giống như bạn sử dụng trong các ngôn ngữ khác.
Bạn có một từ khóa đi đến với tên nhãn.
Và những gì sẽ xảy ra trong mã của bạn là bạn sẽ chuyển đến dòng mã có nhãn đó.
Vì vậy, bạn có thể bỏ qua tất cả các loại mã.
Vì vậy, trong ví dụ này ở đây, chúng ta có một nhãn được gọi là top, và nó
có dấu hai chấm. Đó là cách bạn biết đó là một nhãn.
Và trên cùng có một số tuyên bố. Và ở dưới cùng của
nó, bạn có một câu lệnh if. Và bạn nói nếu char bằng y, hãy chuyển đến đầu trang.
Vì vậy, một lần nữa, bạn thấy cách bạn có thể nhảy xung quanh mã của mình và điều đó khiến bạn rất khó theo dõi.
Vì vậy, không sử dụng nó về cơ bản, trừ khi bạn có rất nhiều, rất nhiều vòng lặp lồng nhau và bạn
muốn nhảy ra khỏi tất cả các vòng lặp. Cảm ơn bạn.