2011-12-27 19 views
23

Tại sao C++ này mã không biên dịch theo VS2010:Tôi có thể khai báo các biến của các kiểu khác nhau trong quá trình khởi tạo vòng lặp for không?

for (int a = 0, short b = 0; a < 10; ++a, ++b) {} 

trong khi một điều này:

short b = 0; 
for (int a = 0; a < 10; ++a, ++b) {} 

là tuyên bố của hai biến của các loại khác nhau bên trong cho vòng initializer cấm? Nếu vậy, làm thế nào bạn có thể làm việc xung quanh nó?

+0

Hình như bạn nói. Sử dụng cùng một kiểu hoạt động: 'for (int a = 0, b = 0; a <10; ++ a, ++ b) {}' Hmm. Không bao giờ nhận thấy rằng trước đây. –

+0

Có đây là cơ chế "vòng lặp đôi" xuất phát từ ngôn ngữ C. Khá hiếm, mặc dù. Không phải là rất dễ đọc. – Raveline

Trả lời

40

Có, điều đó bị cấm. Cũng giống như bạn không thể khai báo các biến của các loại khác nhau trong một tuyên bố khai báo (chỉnh sửa: modulo trình sửa đổi khai báo mà @MrLister đề cập). Bạn có thể khai báo struct

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b) {} 

C++ 03 mã:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b) {} 

Tất nhiên khi tất cả đều 0, bạn có thể bỏ qua các initializers hoàn toàn và viết = { }.

+20

Tôi ghét thực tế là bạn đã chia sẻ điều này. Tôi đặt cược chúng tôi sẽ chi tiêu trong năm tới trả lời các biến thể ngớ ngẩn về việc sử dụng này. Khi trong thực tế, chúng tôi không bao giờ muốn nhìn thấy nó một lần nữa. –

+2

@Loki: Đây không phải là lần đầu tiên 'cho struct' hack xuất hiện trên SO. – fredoverflow

+0

@Fred http://stackoverflow.com/a/889001/34509 –

0

Bạn chỉ có thể khai báo một loại cho câu lệnh. Mã thứ hai là mã có thể sử dụng được.

0

Bạn không thể khai báo biến trong điều kiện while của for (bước tổng hợp).

for (a = 0, short b = 0; a < 10; ++a, ++b) {} 

không hoạt động.

10

Không có gì để làm với vòng lặp for. Điều này cũng không biên dịch nếu bạn viết int a = 0, short b = 0; bên ngoài vòng lặp bất kỳ.
Vì vậy, câu trả lời là: nó là luôn luôn bị cấm khai báo hai biến của các loại khác nhau trong một tuyên bố duy nhất.

Chỉnh sửa: Ồ, đối với pedantic, tôi nhận ra rằng bạn có thể khai báo kiểu cơ sở và kiểu con trỏ trong cùng một câu lệnh, ví dụ int và int, vì vậy chúng sẽ là các kiểu khác nhau.
Hm, điều đó khiến tôi suy nghĩ. Trong môi trường 32 bit, một con trỏ sẽ là 4 byte, giống như một int, vì vậy bạn có thể sử dụng short a = 0, * b = 0; và sau đó cast b vào int. Hm ...

1

gì bị cấm là sự kết thúc của một câu lệnh bằng một dấu phẩy như bạn làm trong int a = 0, short ...

Nếu bạn muốn sử dụng ký hiệu này sau đó Bothe muss biến có cùng kiểu int i = 0, s = 0;