2010-04-04 37 views
7

Tôi đang học C và tôi thấy trong một cuốn sách mà một mẫu thử nghiệm hàm có dạng void f() và trong khai báo hàm hoặc trong hàm gọi, hàm f nhận các đối số.
Vì vậy, trong khai báo hàm, chúng ta có một cái gì đó như void f (long double y [], long double A) và trong hàm gọi là f (y, A).
Hàm đang thực hiện các thao tác trên mảng y tức là khi hàm được gọi, một số phần tử trong mảng y đang thay đổi. A chỉ là một giá trị số không đổi không thay đổi. Tôi có hai câu hỏi:Nguyên mẫu hàm C: void f(). Được khuyến nghị?

  1. Nếu xác định nguyên mẫu hàm ở trên cùng trong chương trình là void f Hoặc là tốt hơn để đặt nó như là void f (dài gấp đôi y [], dài gấp đôi A) như trong tuyên bố chức năng?

  2. Hàm được gọi f đang thay đổi các phần tử trong mảng y. Làm mất hiệu lực kiểu trả về đúng không? Chương trình hoạt động tốt như vậy với khoảng trống như được mô tả.
    Hoặc tôi nên thay đổi tất cả "khoảng trống" thành "dài gấp đôi".
    Tôi đang làm việc với đôi dài vì tôi cần độ chính xác cao nhất có thể mặc dù trên máy tính của tôi cả hai đôi và dài gấp đôi mang lại cho tôi 15 chữ số chính xác.

Thanks a lot

+5

Bạn đã xem sách này bằng sách nào? –

+0

"void f (long double y [], long double A)" là "long double y []" được phép làm tham số? –

+0

@Andrei, chắc chắn, tại sao không? –

Trả lời

7

Nếu xác định nguyên mẫu hàm tại phần trên cùng của chương trình là void f() a thực hành tốt? Hoặc là tốt hơn để đặt nó là void f (dài gấp đôi y [], dài đôi A) như trong hàm khai báo?

Chắc chắn sau này - trước đây không cung cấp cho trình biên dịch bất kỳ loại thông tin nào để kiểm tra thời gian biên dịch. void f() cho trình biên dịch biết rằng f có danh sách đối số không xác định. I E. bất cứ điều gì đi.

Hàm được gọi f đang thay đổi phần tử trong mảng y. Hủy bỏ loại trả về đúng không? Chương trình là hoạt động tốt với khoảng trống như được mô tả.

Loại trả về không có gì liên quan đến thông số đang được sửa đổi. Bạn có thể có loại trả về không phải là void nếu bạn muốn cho biết mã thành công.

+0

Sau khi đọc tất cả các ý kiến ​​của bạn ở đây, tôi hiểu rằng mặc dù void f() hoạt động, nó không được khuyến khích. Đó là an toàn hơn để hướng dẫn trình biên dịch các đối số đúng. – yCalleecharan

4

Không nó không phải là tốt để có một tuyên bố với các đối số không xác định. Trong C (nhưng không phải trong C++), nó được phép khai báo một hàm là f() mà không xác định đối số, nhưng việc sử dụng chức năng đó nên tránh. Nếu hàm không chấp nhận bất kỳ đối số nào, hãy sử dụng f(void) để đánh dấu rõ ràng điều đó. Nếu hàm chấp nhận đối số, luôn bao gồm các loại đối số trong khai báo.

+0

Cảm ơn bạn đã làm rõ. Sau khi đọc tất cả 3 câu trả lời ở đây, tôi hiểu rằng mã phải được thực hiện dễ đọc nhất có thể và tôi cần tuân thủ các tiêu chuẩn lập trình tốt. – yCalleecharan

10

Câu hỏi của bạn bị hỗn hợp theo thuật ngữ.

void f(); 

không một nguyên mẫu hàm trong C. Đây là một tuyên bố chức năng mà không giới thiệu một nguyên mẫu.Trong khi đó,

void f(long double y[], long double A); 

cũng là một tuyên bố chức năng và đây là một bản mẫu (ví dụ: giới thiệu mẫu thử cho f).

Để trả lời các câu hỏi của bạn, có một phương pháp hay để khai báo hàm với nguyên mẫu (tức là tốt hơn là khai báo chúng với nguyên mẫu hơn là không có nguyên mẫu). Thông thường, bạn nên khai báo các nguyên mẫu cho tất cả các hàm bên ngoài của bạn (và void f() không phải là một nguyên mẫu).

Đối với các loại trả lại, tất cả đều là mục đích của bạn. Tôi không thấy làm thế nào thực tế là bạn đang thay đổi các yếu tố của mảng nên làm cho nó tốt hơn để trả lại long double thay vì void.

+0

Cảm ơn bạn đã chỉ ra sai lầm trong thuật ngữ và cho nhận xét cuối cùng về chức năng của hàm là "trả về". – yCalleecharan

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