2010-02-26 34 views
19

Tại sao điều này không hợp lệNhiều Counter Vấn đề Trong vòng lặp for

for(int i = 0, int x = 0; some condition; ++i, ++x) 

và đây là

int i, x; 
for(i = 0, x = 0; some condition; ++i, ++x) 

Cảm ơn

+0

có thể trùng lặp của [Tôi có thể khai báo các biến của các loại khác nhau trong quá trình khởi tạo vòng lặp for?] (Http://stackoverflow.com/questions/8644707/can-i-declare-variables-of-different -types-in-the-khởi-of-a-cho-loop) –

+0

@Mechanicalsnail: các bị cáo buộc trùng lặp là mới hơn so với câu hỏi này. Tại sao bạn đóng này? – bitmask

+0

@bitmask: Một câu hỏi khác có một chút giải thích thêm về những gì chúng tôi đang cố gắng để làm, và có câu trả lời upvoted hơn. Nhưng để đóng là một cuộc gọi phán xét. –

Trả lời

7

phiên bản đúng là

for (int i = 0, x = 0; some condition; ++i, ++x) 
30

công trình này:

for(int i = 0, x = 0; some condition; ++i, ++x) 

nó giống như một khai báo biến:

int i, j; // correct 
int i, int j; // wrong, must not repeat type 
+5

Trong thực tế, nó _is_ một tuyên bố biến. Để được chính xác, cả hai đều là 'đơn giản-declaration' s – MSalters

3

Bởi vì một khai báo biến (như int x) không phải là một biểu hiện và các nhà điều hành dấu phẩy (,) chỉ kết hợp biểu thức.

+0

này cho thấy một hạn chế buồn của vòng lặp for khối khởi động. tức là tất cả các biến được khởi tạo trong khối khởi tạo phải cùng loại. –

+0

Hầu như:!. 'For (int x, y *; ... ' – MSalters

+0

Cẩn thận,', 'trong việc kê khai' int x, y;' là KHÔNG toán tử phẩy – fredoverflow

8

Tại sao nó hợp lệ? Đó là một construst cú pháp vô nghĩa. Bạn đang cố nói gì với nó?

Phần đầu tiên của tiêu đề for là tuyên bố.

int i = 0, int x = 0 

không phải là khai báo hợp lệ. Nó sẽ không biên dịch trong for với cùng lý do tại sao nó sẽ không biên dịch bất cứ nơi nào khác trong chương trình

int i = 0, int x = 0; // Syntax error 

Khi bạn cần khai báo hai đối tượng thuộc loại int trong một tuyên bố, bạn làm điều đó như sau

int i = 0, x = 0; // OK 

điều tương tự có thể được sử dụng trong for

for(int i = 0, x = 0; some condition; ++i, ++x) 

(Nhưng khi bạn cần phải khai báo hai biến của khác nhau loại, nó không thể được thực hiện bởi một tuyên bố và, do đó, cả hai không thể được tuyên bố trong for cùng một lúc. Ít nhất một trong số họ sẽ phải được khai báo trước khi for)

3

này là hợp pháp.

for(int i = 0, x = 0; condition; ++i, ++x); 

int x, int y không phải là một cách hợp pháp của khai báo biến;

34

khi bạn cần phải khai báo hai biến của các loại khác nhau, nó không thể được thực hiện bằng một tuyên bố

Hackety Hack hack:

for (struct {int i; char c;} loop = {0, 'a'}; loop.i < 26; ++loop.i, ++loop.c) 
{ 
    std::cout << loop.c << '\n'; 
} 

;-)

+5

Wow Chưa bao giờ nghe nói về điều này trước khi – sharptooth

+8

+ 1 cho "Hackety Hack hack". –

+0

điều đó có vẻ giống như một hack tốt đẹp. bạn có nhận xét về một số chi tiết lạ? Nếu tôi thay thế loại i biến với một cái gì đó giống như std :: vector :: const_iterator, nó sẽ không biên dịch. .. dường như mã bẩn anyway để viết struct dài tạm thời với hai vòng lặp trong vòng lặp for, nhưng tôi chỉ khao khát hiểu biết. – wf34

0

Tôi đã thực hiện phương pháp này để tính toán sự khác biệt chéo. Ở đây tôi tính toán số tiền của Antidiagonal.

for(int i=0,j=n-1; i<n,j>=0;i++,j--){ 
    sum_right += a[i][j]; 
    } 
Các vấn đề liên quan