2010-02-12 24 views
27

Tôi phải trở về cấp độ trước của đệ quy. là cú pháp như dưới đây đúng không?Tôi có thể quay trở lại chức năng vô hiệu không?

void f() 
{ 
    // some code here 
    // 
    return; 
} 
+23

bạn đã thử biên dịch chưa? –

+14

@Mitch: Hợp lý như vậy, nó chỉ chứng minh rằng trình biên dịch _your_ của bạn hỗ trợ nó, không cho dù đó thực sự là hợp lệ C++. Ví dụ. Tôi có thể dễ dàng "chứng minh" rằng 'void main()' là chính xác theo cách đó. – MSalters

Trả lời

57

Có, bạn có thể trở về từ một hàm rỗng.

Điều thú vị là bạn cũng có thể trả về khoảng trống từ hàm void. Ví dụ:

void foo() 
{ 
    return void(); 
} 

Như mong đợi, điều này giống như đồng bằng return;. Nó có vẻ huyền bí, nhưng lý do là cho mẫu nhất quán:

template<class T> 
T default_value() 
{ 
    return T(); 
} 

Ở đây, default_value trả về một đối tượng mặc định-xây dựng bằng loại T, và vì khả năng trở void, nó hoạt động ngay cả khi T = void.

+0

có phải là điều tương tự nếu trong lệnh trả về, bạn gọi một hàm, trả về một khoảng trống không? ví dụ. return f(); trong đó nguyên mẫu của f là void f(); – Goaler444

+0

oh chờ đợi, vì vậy hàm tạo này có chữ ký void (void)? Vì vậy, 'return void (void())' cũng hợp lệ. Cuộc thi obfuscation mã bất cứ ai? –

10

Chắc chắn. Bạn không nên trở về một giá trị thực tế.

3

Có, bạn có thể sử dụng mã đó để trả về từ hàm. (Tôi phải rất tiết lộ ở đây để làm cho Stack Overflow không nói rằng câu trả lời của tôi quá ngắn)

+0

Không, chỉ có 15 ký tự. Tôi tin tưởng, tôi chạy vào nó * tất cả * thời gian ... –

+1

IIRC bạn sử dụng để có thể pad nó với không gian :-) – xyz

+0

Bạn có thể sử dụng dấu ba chấm để đệm ra một vài ký tự, và '(15)' cung cấp cho bạn thậm chí nhiều hơn trong khi làm cho nó rõ ràng rằng bạn đang làm nó chỉ cho padding. –

2

Bạn không cần phải trả lại ở đó, chương trình sẽ tự quay trở lại chức năng trước đó, đi vào gỡ rối chế độ và bước qua và bạn có thể nhìn thấy nó cho mình. Mặt khác, tôi không nghĩ rằng việc quay trở lại sẽ gây hại cho chương trình.

+0

Có, bạn là chính xác. Mặc dù không biết những gì một số mã ở đây tham chiếu là đề cập đến nó có thể có ý nghĩa để được rõ ràng.Mặc dù sự trở lại ngay trước khi kết thúc cú đúp là không liên quan. – Casey

4

Có, điều đó sẽ trở về từ hàm đến mức đệ quy trước đó. Đây sẽ là giải thích rất cơ bản, nhưng khi bạn gọi một hàm bạn đang tạo một ngăn xếp cuộc gọi mới. Trong một hàm đệ quy, bạn chỉ cần thêm vào ngăn xếp cuộc gọi đó. Bằng cách trở về từ một hàm, cho dù bạn trả về một giá trị hay không, bạn đang di chuyển con trỏ ngăn xếp trở lại hàm trước đó trên ngăn xếp. Nó giống như một chồng đĩa. Bạn tiếp tục đặt tấm trên nó, nhưng hơn di chuyển trở lại tấm đầu.

Bạn cũng có thể xác minh điều này bằng cách sử dụng trình gỡ lỗi. Chỉ cần đặt một vài điểm break trong mã của bạn và bước qua nó. Bạn có thể tự xác minh rằng nó hoạt động.

+1

Ngăn xếp khung. Các chủ đề mới có các ngăn xếp mới, các cuộc gọi hàm nhận các khung ngăn xếp mới trên cùng một ngăn xếp trong một chuỗi nhất định. Chỉ muốn xóa chi tiết đó vì nó có thể gây nhầm lẫn cho người mới đến. – stu

2

Câu trả lời đơn giản cho điều này là CÓ! C++ nhận ra phương thức void như một hàm không trả về. Về cơ bản nó nói với trình biên dịch rằng bất cứ điều gì xảy ra, một khi bạn nhìn thấy sự phá vỡ return; và để lại phương thức ....

2

Như mọi người khác đã nói, có bạn có thể. Trong ví dụ này, trả về là không cần thiết và có nhiệm vụ phục vụ một mục đích. Tôi nghĩ rằng những gì bạn đang đề cập đến là một sự trở lại sớm ở giữa một chức năng. Bạn có thể làm điều đó quá tuy nhiên nó là thực hành lập trình xấu bởi vì nó dẫn đến luồng điều khiển phức tạp (không phải một lần xuất cảnh duy nhất), cùng với các câu lệnh như ngắt. Thay vào đó, chỉ cần bỏ qua phần còn lại của hàm bằng cách sử dụng các điều kiện như if/else().

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