2010-05-06 39 views
22

Điều này là quá cơ bản tôi nghĩ, nhưng làm thế nào để cả hai công việc này?Trả về một toán tử hoặc một hàm?

return true; // 1 

return (true); // 2 

tương tự: sizeof, exit

tôi đoán:

Nếu trở lại là một chức năng, 1 sẽ sai lầm.

Vì vậy, trở nên một unary operator mà cũng có thể mất trong ngoặc ... khá nhiều như unary minus: -5-(5), cả hai đều ổn.

Đó có phải là một toán tử đơn nhất không?

+25

Nếu 'return' là một hàm, nó sẽ tự động trả về như thế nào? – Nefrubyr

+4

@Nefrubyr: các hàm void không cần báo cáo trả về rõ ràng. – Lazer

+1

sizeof là lệnh biên dịch. Như một hệ quả là Một gotchas khá nổi tiếng là sizeof (f()) không thực sự gọi f. – fulmicoton

Trả lời

29

return là một từ khóa rằng thao tác kiểm soát dòng chảy. Trong đó nó tương tự như if, for v.v. Nó có thể được sử dụng có hoặc không có biểu thức (return; trả về từ hàm void). Tất nhiên, như với tất cả các biểu thức, dấu ngoặc đơn phụ được cho phép. (Vì vậy return (42); cũng tương tự như int i = (4*10+2);, trong cả hai trường hợp, các dấu ngoặc đơn là cần thiết, nhưng cho phép.)

sizeof là một từ khóa đó là một hành, tương tự như new, delete, +, ->, :: vv

std::exit() là một định danh mà biểu thị một functio n của thư viện chuẩn C (không bao giờ trả về người gọi).

+0

Tôi nghĩ 'sizeof()' là một macro? Hoặc ít nhất chỉ tính tại thời gian biên dịch? – dlamotte

+0

nevermind, 'sizeof()' là từ khóa biên dịch trong C89, nhưng bây giờ là một điều thời gian chạy (do VLA's, yuck!) – dlamotte

+0

@xyld: Nó vẫn là __keyword__ và nó vẫn là __operator__. ':)' – sbi

27

return chỉ là cấu trúc luồng ngôn ngữ/kiểm soát. Nó chắc chắn không phải là một hàm, vì nó không thể thực hiện được cú pháp, và nó cũng không thực sự là một toán tử vì nó không có giá trị trả về.

+0

@Will Vousden: "cấu trúc dòng điều khiển" là gì, ngoài tên gọi cho tôi biết điều gì? – Lazer

+2

Điểm tốt. Nếu 'return' có giá trị' return', nó sẽ có quá nhiều đệ quy;) – ereOn

+3

@eSKay: Cấu trúc luồng điều khiển là thứ làm thay đổi luồng điều khiển chương trình. Xem ở đây: http://en.wikipedia.org/wiki/Control_flow 'return' cũng có thể được coi là một ngôn ngữ xây dựng, vì nó thực sự là một phần của cú pháp của ngôn ngữ. Xem tại đây: http: //en.wikipedia.org/wiki/Language_construct –

17

return không phải là toán tử và không phải là hàm. return là từ khóa tạo thành một câu hỏi trả về trả lại, thuộc về danh mục câu lệnh nhảy nhảy. Về vấn đề đó, nó hoàn toàn không có điểm tương đồng với sizeof hoặc exit.

Yêu cầu đặt () xung quanh tranh cãi về return tồn tại trong các phiên bản trước tiêu chuẩn cổ của C (CRM C, ví dụ), nhưng đã nhanh chóng bị loại bỏ, mặc dù thói quen kỳ quặc để bọc các đối số của return trong thừa () có thể được nhìn thấy theo thời gian ngay cả ngày hôm nay.

+0

@AndreyT: là các toán tử 'sizeof' và' exit'? – Lazer

+2

@eSKay: 'sizeof' là toán tử. 'exit' là một hàm thư viện stanadard. – AnT

+0

okay ... vì vậy trong trường hợp điều kiện lỗi trong chương trình của tôi, nơi tôi cần phải hủy bỏ, tôi có nên sử dụng 'exit (0)' hoặc 'return' không? Có một số tình huống mà 'exit (0)' nên được ưa thích? – Lazer

7

trở lại là một từ khóa kiểm soát dòng chảy, giống như goto, break, continue, if, else ... Đừng nghĩ về nó như một nhà điều hành, bởi vì nó không làm thay đổi giá trị đằng sau nó. () chỉ để đánh giá các biểu thức và kết quả của biểu thức được đánh giá sẽ được chuyển đến hàm gọi (cách thức phụ thuộc trình biên dịch om thực hiện).

Nó cũng chắc chắn không có chức năng, chỉ cần suy nghĩ về nó: làm thế nào bạn sẽ trở về từ trở lại?

4

"trả lại" không phải là thường trình cũng như toán tử.

Nó chuyển sang hướng dẫn lắp ráp nổi tiếng. Ví dụ, trên kiến ​​trúc x86, nó dịch thành "ret", và trên PowerPC, kiến ​​trúc nó chuyển thành "blr".

Đối với giá trị nó trả về, trình biên dịch sẽ di chuyển giá trị đó vào (các) thanh ghi thích hợp trước khi đưa ra lệnh trả về. Về kiến ​​trúc x86, đây thường là EAX và EDX nếu cần thiết - thanh ghi sẽ thay đổi một chút cho x86-64. Trên PPC, nếu bộ nhớ phục vụ, nó là r1 - những người khác có thể sửa tôi nếu tôi sai về chi tiết đó.

Hy vọng điều này sẽ hữu ích.

+0

Như tôi nhớ, r1 là con trỏ ngăn xếp và giá trị trả về là r3. Xem hình A-1 tại đây: http://wall.riscom.net/books/proc/ppc/cwg/a_abi.html – Nefrubyr

2

trở về luôn luôn có thể được theo sau bởi một biểu thức, nhưng để trở về kiểu kiểm tra, biểu thức phải có cùng loại kiểu trả về của hàm.

hense bạn có thể khái quát hóa nó bằng cách nói

return Expression. 

(Trong một hàm với một loại void Đổi lại, return có thể không được theo sau bởi một biểu thức; một trần return chỉ đơn giản là ra khỏi hàm.)

0

"Yêu cầu đặt() xung quanh đối số trả về tồn tại trong các phiên bản tiền chuẩn C cũ (CRM C), nhưng đã nhanh chóng bị loại bỏ, mặc dù thói quen kỳ quặc bao trùm đối số trả về trong thừa() có thể được nhìn thấy theo thời gian ngay cả ngày hôm nay. "

Vâng, bạn biết bạn đang xem xét một số mã cũ hoặc ai đó nghĩ rằng trả lại là một hàm khi bạn nhìn thấy chúng bằng cách sử dụng parens với nó tất cả các thời gian. Người hướng dẫn đại học của tôi đã làm điều đó và nó làm tôi băn khoăn mọi lúc. Ồ, ít nhất là anh ấy nhất quán.

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