2012-11-16 78 views

Trả lời

8
for (i=0;i<5;i++); 

tương đương với

for (i=0;i<5;i++){} 
23

chấm phẩy là một tuyên bố hợp pháp gọi là rỗng tuyên bố* có nghĩa là "không làm gì cả". Vì vòng lặp for thực hiện một thao tác đơn lẻ (có thể là một khối được bao bọc trong {}) dấu chấm phẩy được coi là phần thân của vòng lặp, dẫn đến hành vi mà bạn quan sát thấy.

Các mã sau

for (i=0;i<5;i++); 
{ 
    printf("hello\n"); 
} 

được hiểu như sau:

  • Lặp lại năm lần for (i=0;i<5;i++)
  • ... không làm gì cả (dấu chấm phẩy)
  • Mở một phạm vi mới cho các biến địa phương {
  • ... In "hello"
  • Đóng phạm vi }

Như bạn có thể thấy, các hoạt động đó được lặp đi lặp lại là ;, không phải là printf.


* Xem K&R, phần 1.5.2

+2

Dấu chấm phẩy không phải là "toán tử". Nó chấm dứt một "tuyên bố", và nó hợp lệ cho tuyên bố không chứa gì cả. Một số trình biên dịch cảnh báo về điều này bởi vì nó là một sai lầm phổ biến. Dấu ngoặc rỗng '{}' là cách ưa thích để không làm gì cả. – ams

+0

Dấu chấm phẩy là * dấu chấm câu * nhưng không phải là toán tử * *. – ouah

+0

@ams Vui lòng xem chỉnh sửa. Tôi đã sai khi gọi nó là một nhà điều hành, nó là một tuyên bố (ít nhất là theo K & R) – dasblinkenlight

3

Tuyên bố bao gồm chỉ ; dấu hiệu được gọi là rỗng tuyên bố và nó chỉ làm ... không có gì.

Ví dụ, đây là hợp lệ:

void foo(void) 
{ 
    ; 
    ; 
    ; 
} 

Nó có thể được sử dụng ở khắp mọi nơi một tuyên bố có thể được sử dụng, ví dụ như trong:

if (bla) 
    ; 
else 
    ; 

Xem C đoạn chuẩn:

(C99, 6.8.3p3) "A null statement (consisting of just a semicolon) performs no operations."

1

Mã này dưới đây sẽ in "Xin chào" 5 lần ..

for(i=0;i<5,printf("Hello\n");i++); 
+1

Thực tế, không có điều đó sẽ không in Xin chào 5 lần; nó sẽ in Xin chào một số lần vô hạn. Điều này là do điều kiện là 'i <5, printf (" Hello \ n ");' và toán tử dấu phẩy đánh giá LHS của nó ('i <5') và bỏ qua kết quả, sau đó đánh giá RHS (' printf ("Hello \ n ")'), trả về 6 vì nó ghi 6 ký tự vào đầu ra tiêu chuẩn; bởi vì 6 là đúng (nó không phải là số không), vòng lặp tiếp tục, vô thời hạn. Với các tùy chọn trình biên dịch mặc định của tôi cho GCC (bao gồm '-Werror'), mã không biên dịch:' error: toán hạng trái của biểu thức dấu phẩy không có hiệu lực [-Werror = unused-value] '. –

0

Nhiều trình biên dịch hiển thị lỗi cú pháp khi bạn đặt dấu chấm phẩy sau vòng lặp for nhưng theo trình biên dịch gcc (Linux) hoặc Dev-cpp bạn có thể đặt dấu chấm phẩy

Ví dụ

for(int i=0;i<=5;i++); 

hoặc

for(int i=0;i<=5;i++) 
{//blank body} 

Từ ví dụ trên thì rõ ràng nếu chúng ta đặt dấu ngoặc trống hoặc dấu chấm phẩy sau vòng lặp for có nghĩa là chúng tôi đã không nhập bất kỳ biến được nêu ra.

Bây giờ, hãy đến câu hỏi của bạn.
Nếu bạn muốn in chào năm lần, bạn phải viết chương trình của bạn như

for(int i=0;i<5;i++) 
{ 
    printf("hello"); 
} 

tôi hy vọng bạn hiểu
cổ vũ !!
Rahul Vashisth

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