2013-08-30 34 views
9

tôi đang viết một cái gì đó giống như mã này:Sử dụng các biến khai báo bên trong do-while loop trong tình trạng

do { 
    int i = 0; 
    int j = i * 2; 
    cout<<j; 

    i++; 
} while (j < 100); 

(http://codepad.org/n5ym7J5w)

và tôi đã rất ngạc nhiên khi biên dịch của tôi nói với tôi rằng tôi không thể sử dụng biến 'j' bởi vì nó không được khai báo bên ngoài vòng lặp do-while.

Tôi chỉ tò mò về nếu có bất kỳ lý do kỹ thuật nào tại sao không thể thực hiện được điều này.

+2

'double' là từ khóa và có,' double' (biến) không nằm trong phạm vi ngoài vòng lặp (do đó không thể được sử dụng làm điều kiện); – Chad

+0

Xin lỗi về việc sử dụng double làm tên biến. lol. Nó được chỉnh sửa ngay bây giờ –

+0

biến không thể có tên tăng gấp đôi vì từ khóa của nó –

Trả lời

2

Có lý do khiến điều này không thể thực hiện được. Đó là do giới hạn của "tuyên bố phạm vi".

Biến i và j của bạn đã được khai báo với "phạm vi cục bộ" - đó là các biến bên trong {} dấu ngoặc vuông. Bạn thực sự muốn j được khai báo với "phạm vi tuyên bố" nhưng điều này là không thể.

Phạm vi tuyên bố là các biến được khai báo là một phần của câu lệnh 'for', 'while', 'if' hoặc 'switch'. Tuy nhiên, phạm vi báo cáo không bao gồm các câu lệnh do-while, đó là lý do tại sao bạn không thể thực hiện điều này.

Về cơ bản, bạn đã gặp phải nhược điểm ngôn ngữ khi sử dụng do-while.

Sẽ tốt hơn nếu ngôn ngữ cung cấp:

do { 
. 
. 
. 
} while (int j < 100); 

nhưng nó không cung cấp này.

12

Phạm vi j chỉ nằm trong các dấu ngoặc đơn {}. Bạn không thể sử dụng nó trong điều kiện vòng lặp, nằm ngoài phạm vi đó.

Từ C++ dự thảo tiêu chuẩn tôi có ích:

Một tên tuyên bố trong một khối là địa phương để khối đó. Phạm vi tiềm năng của nó bắt đầu tại thời điểm khai báo và kết thúc vào cuối khu vực khai báo của nó.

Một "khối" còn được gọi là "câu lệnh ghép" và là tập hợp các câu lệnh được đính kèm trong dấu ngoặc đơn {}.

-1
int j = 0; 
for(int i = 0;j < 100;++i){ 
j = i * 2; 
cout<<j; 
} 

trước mỗi vòng lặp đặt i = 0; và tuyên bố là vòng lặp int + for loop hoạt động tốt hơn

+0

Chăm sóc để giải thích? Mã không có giải thích không được chấp nhận trên SO. Ngoài ra, xin vui lòng thụt lề. -1 – syam

+0

im tiếng anh xấu, chỉ cần tôi cố gắng giúp đỡ và nhận được -1 thực sự ... –

+0

Có -1 bởi vì bạn đã không cung cấp bất kỳ lời giải thích. Nó không quan trọng nếu tiếng anh của bạn không phải là rất tốt, nhưng hãy thử ít nhất. Làm thế nào chúng ta có nghĩa vụ phải hiểu những gì bạn có nghĩa là nếu bạn chỉ cần cung cấp cho mã và không có lời giải thích ở tất cả? Tôi biết điều này có vẻ khắc nghiệt nhưng đây là cách chúng tôi tiếp tục cải thiện cả SO và bản thân mình. – syam

0

Đôi, phải được thay đổi thành từ không được đặt trước (nhờ Chad), cần được khai báo bên ngoài phạm vi của lệnh để sử dụng trong điều kiện trong khi.

int i = 0; 
int d = 0; 
do{ 
    d = i * 2; 
    cout << d; 
    i++; 
} while (d < 100); 
+0

Bạn _would_ thay đổi tên của 'double' nếu bạn muốn nó _compile_. – Chad

0
  • Cú pháp cho vòng lặp do là {} bất kỳ khai báo biến nào trong {} sẽ chỉ tồn tại trong phạm vi này. Do đó phạm vi của j chỉ nằm trong phạm vi {} vì nó được khai báo trong phạm vi này. Nó chỉ có thể được gọi hoặc được tham chiếu trong phạm vi này.
  • Nếu bạn muốn truy cập j ngoài phạm vi này, bạn cần khai báo j là biến toàn cục. Di chuyển khai báo j bên ngoài phạm vi này.
Các vấn đề liên quan