2015-11-03 14 views
21

tôi đi theo cú pháp nàyVòng lặp for có thể được gán trong câu lệnh của nó không?

for (string st; getline(is, st, ' '); v.push_back(st)); 
     ^    ^    ^
    initialization condition, increment ??? 

Làm thế nào để công việc v.push_back(st) như một tăng khi điều đó đang được bao phủ bởi getline(is, st, ' ')?

+11

Nó không phải là một 'gia tăng', chỉ là một hoạt động, bất kỳ hoạt động nào. Điều này tiếp tục đẩy chuỗi vào vectơ miễn là điều kiện được đáp ứng. – Unimportant

+0

Tóm lại, ** Có ** nó có thể. – CinCout

+1

'v.push_back' là một cuộc gọi chức năng, không phải là nhiệm vụ –

Trả lời

34

Đó là tương đương với:

for (string st; getline(is, st, ' ');) 
    v.push_back(st); 

hay:

{ 
    string st; 
    while (getline(is, st, ' ')) 
     v.push_back(st); 
} 

Thực tế là báo cáo kết quả increment được thực hiện ở phần cuối của phần thân của vòng lặp mỗi khi điều kiện được thỏa mãn . Vì vậy, bạn có thể xem nó như là hướng dẫn cuối cùng của cơ thể.

Đôi khi, bạn có thể để trống câu lệnh tăng; trong trường hợp này, bạn đặt chỉ dẫn duy nhất của cơ thể thay cho câu lệnh tăng dần.

+0

Cảm ơn bạn, tôi đã không biết rằng câu lệnh tăng có thể là bất cứ điều gì ngoài tuyên bố gia tăng. –

+5

"trong trường hợp này, bạn đặt chỉ lệnh duy nhất của cơ thể thay cho câu lệnh tăng dần." - Bạn * có thể * làm điều này, nhưng đó có thể không phải là một ý tưởng tuyệt vời từ quan điểm kiểu mã hóa. Nếu bạn cần thêm câu lệnh thứ hai thì sao? IMHO sự gia tăng nên được ngữ nghĩa một "sẵn sàng cho lặp tiếp theo/kết thúc này lặp đi lặp lại" -kind điều, có thể hoặc có thể không phải là trường hợp ở đây. – Kevin

+3

@Kevin Bạn đang đá xuống một cánh cửa mở! Tôi hoàn toàn đồng ý. –

4

Vòng lặp này sẽ chạy trong khi getline trả về luồng không có lỗi (hãy xem operator bool). Trên mỗi lần lặp lại, st sẽ được đẩy vào v. Tôi muốn viết lại này về while loop:

string st; 
while(getline(is, st, ' ')) 
{ 
    v.push_back(st) 
} 
28

Từ standard:

for (init-statement condition(optional) ; iteration_expression(optional)) statement 

iteration_expression - bất kỳ biểu hiện, mà được thực hiện sau mỗi lặp của vòng lặp và trước khi tái đánh giá tình trạng. Thông thường, đây là biểu hiện mà increments vòng lặp truy cập

Cú pháp trên tạo mã tương đương với:

{ 
    init_statement; 
    while (condition) { 
     statement; 
     iteration_expression; 
    } 
} 

Vì vậy, nó không nhất thiết phải được tăng.

+0

Không nên là tùy chọn 'init-statement'? – user

+1

Semicolon đã được thêm vào do nhầm lẫn khi chỉnh sửa, tôi sẽ cập nhật nó. Theo định nghĩa chính thức, nó không phải là tùy chọn, nó chỉ có thể rỗng và phải kết thúc bằng ';' –

+4

Vâng, nếu bạn sử dụng 'tiếp tục' ở đâu đó trong' câu lệnh', thì viết lại của bạn không hoàn toàn chính xác. – Deduplicator

8

không phải là biểu thức tăng dần. Những gì nó dự kiến ​​sẽ làm được xác định bởi bạn. Mã này cũng giống như ngữ nghĩa sau đây.

string st;      // run before the loop and only once 
while (getline(is, st, ' ')) { // condition used to determine the loop should continue or break 
    v.push_back(st);    // run every time inside the loop 
} 
9

Nó không tăng bất cứ điều gì. Vòng lặp for kết thúc khi phần điều kiện không thỏa mãn. Vì vậy, khi getline trả về false, vòng lặp sẽ kết thúc.

Trong nhiều trường hợp, thao tác thực sự tăng một biến và điều kiện có thể kiểm tra xem biến đó có vượt quá giới hạn nào không. Đừng để điều đó làm bạn bối rối, chỉ cần nhớ rằng for vòng lặp có như sau (nói chung) cấu trúc:

for (init; condition; operation) 
+1

Cảm ơn bạn, luôn luôn giả định rằng 'hoạt động' sẽ là một tuyên bố gia tăng. –

6

Câu trả lời là nó không hoạt động như một tăng.

Vòng lặp for sẽ có kết quả tương tự như vòng lặp while dưới đây:

string st; 
while (getline(is, st, ' ')) 
{ 
    v.push_back(st); 
} 

Người ta có thể tranh luận nếu ví dụ vòng lặp bạn đã là một phong cách mã hóa mong muốn.

5

Làm cách nào để số tiền v.push_back(st) tăng lên khi được bao phủ bởi getline(is, st, ' ')?

Không. Bạn đã hiểu lầm (hoặc bị nhầm lẫn) cấu trúc vòng lặp for.

Dưới đây là các thành phần của nó:

  • một tuyên bố được đánh giá trước khi vòng lặp bắt đầu;
  • một biểu thức được đánh giá ở đầu mỗi lần lặp lại, biểu thức này sẽ bị hủy nếu biểu thức chuyển thành boolean false;
  • tuyên bố không khai báo được đánh giá ở cuối mỗi lần lặp lại.

Vậy đó.

Không có gì để quyết định (nếu có!) Của các thành phần này thực hiện tăng. Hãy xem xét ví dụ phổ biến for (;;) & hellip; không có hoạt động ở đây cả, hãy để một mình một gia tăng!

1

Tất cả những điều quan trọng là trạng thái cuối cùng của mã trong khối điều kiện có giá trị. Giá trị đó được so sánh với 0 và nếu không, vòng lặp for sẽ không được nhập. Về cơ bản, trong những ngày chương trình nhỏ, cũ của telco sử dụng C và Unix, nội dung của Accumulator được đánh giá về trạng thái bằng cách kiểm tra cờ Z'ero sau khi mã trong khối điều kiện được thực thi.

1

v.push_back (st) là một hàm thực hiện một phép toán trên tham số 'st'. các hoạt động tuy nhiên, theo câu hỏi của bạn không được hiển thị. Vì vậy, chúng tôi không thể xác định nếu đó là một gia tăng. Nhưng sau đó, cú pháp là rất có thể !!!

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