2012-11-05 38 views
5

Trong khi Tôi mới vào c và muốn giúp đỡ trong chương trình nàyC: trường hợp chuyển đổi với toán tử logic

mã của tôi là:

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 

    int suite=2; 

    switch(suite) 
    {   
     case 1||2: 
     printf("hi"); 

     case 3: 
     printf("byee"); 

     default: 
     printf("hello"); 
    } 

    printf("I thought somebody"); 
    getche(); 
    } 

Tôi đang làm việc trong turbo c và nó cho thấy không có lỗi và đầu ra là
helloTôi nghĩ ai đó

Hãy cho tôi biết cách hoạt động này ??? lưu ý: - ở đây nghỉ không phải là trường hợp như tôi cố ý để lại chúng.

+7

Bạn nên gặp gỡ bạn bè: Nhập và Space Bar. Chúng thực sự tuyệt vời và có thể làm cho mã của bạn tuyệt vời nếu bạn yêu cầu chúng một cách độc đáo. –

+0

Cảm ơn bạn @Aniket ... –

+0

@BobKaufman Tôi chỉ chỉnh sửa một phần - một phần của nó chưa bao giờ được lưu. Cảm ơn DaoWen là tốt :-) –

Trả lời

6

làm điều này:

switch(suite){ 
    case 1:/*fall through*/ 
    case 2: 
    printf("Hi"); 
... 
} 

Đây sẽ là cách rất nhiều bụi để làm điều đó. Biểu thức 1||2 đánh giá là 1, vì suite là 2, nó sẽ không khớp với 1 cũng như 3 và chuyển đến trường hợp default.

+7

Chúng được cho phép ... sẽ không hoạt động như mong đợi. –

+0

@ JeffMercado cảm ơn, tôi có thể xem xét cách họ làm việc. Người đàn ông 8 năm với C và một cái gì đó của nó vẫn trở lại và trường học tôi –

+0

Aniket - Vì không có loại boolean trong C (họ chỉ ints) trình biên dịch sẽ làm liên tục gấp trên '1 || 2', như nó sẽ thực hiện trên '0 + 1' và bạn kết thúc bằng' case 1' chứ không phải là _1 hoặc 2_ mà người dùng có thể mong đợi nếu họ đến từ một ngôn ngữ có khớp mẫu đầy đủ với các thay thế. – DaoWen

13
case 1||2: 

Trở thành true. do đó, nó sẽ trở thành case 1: nhưng giá trị được truyền là 2. vì vậy trường hợp mặc định được thực hiện. Sau đó, bạn thực hiện printf("I thought somebody");.

+2

+1 để giải thích lý do mã OP không hoạt động như mong đợi. –

+0

vâng tôi nghĩ rằng nó sẽ hoạt động giống như trường hợp eithor 1 hoặc 2 .. nhưng có vẻ như nó đang hoạt động khác –

+0

hạnh phúc mà bạn đã hiểu .... – Jeyaram

0

Bạn switch trên giá trị 2, khớp với trường hợp default trường hợp trong câu hỏi switch, vì vậy nó in "hello" và sau đó dòng cuối cùng in "Tôi nghĩ ai đó".

2
case 1||2: 

Kết quả trong

case 1: 

1 || 2 đánh giá để 1 (và nhớ; biểu thức không thể thiếu chỉ liên tục được cho phép trong case báo cáo, vì vậy bạn không thể kiểm tra cho nhiều giá trị trong một case).

Bạn muốn sử dụng:

case 1: 
    // fallthrough 
case 2: 
+1

'1 || 2' là một hằng số. Trình biên dịch sẽ có, tại một số điểm, giảm giá trị đó xuống. Rất có thể là lúc phân tích cú pháp. –

+0

@ JeremyJStarcher: Tôi không có ý nói nó không phải là (và tôi đã cho thấy nó được giảm xuống trong ví dụ đầu tiên của tôi), tôi đã tìm ra rằng OP muốn trường hợp tương tự cho 1 và 2. Tuy nhiên, đọc lại, Tôi chắc chắn đã nói một cách khó hiểu. Tôi sẽ sửa nó, cảm ơn. –

+0

NP. Tôi biết tôi thích nó khi mọi người thắt chặt từ ngữ của tôi. –

-1
case (1||2): 
    printf("hi"); 

Chỉ cần đặt dấu ngoặc và thấy sự kỳ diệu.

Trong mã của bạn, chương trình chỉ kiểm tra giá trị đầu tiên và đi xuống. Vì vậy, nó không tìm thấy 2 sau đó nó đi đến trường hợp mặc định.

Nhưng khi bạn xác định rằng cả hai cụm từ tức là 1 và 2 là cùng nhau, sử dụng dấu ngoặc vuông, nó chạy như mong muốn.

+0

Tôi nghi ngờ điều này hoạt động. Bạn đang sử dụng trình biên dịch nào? –

+0

Tôi đã thử nó trong gcc. Nó hoạt động. –

Các vấn đề liên quan