2009-06-27 56 views
6

Tôi mới bắt đầu học C nhưng tôi không hiểu phần này của mã. Bất cứ ai có thể giải thích từng dòng mã và những gì nó làm. Cảm ơn bạn! Xin vui lòng chỉ trả lời những gì tôi nói thay vì nói (nó nên nói trong cuốn sách) Cảm ơn bạn. Hy vọng các bạn có thể giúp tôi.Bạn có thể giải thích chương trình 'Hello world' này không?

#include <stdio.h> 

void SayHello(void); 

int main (int argc, const char * argv[]) { 
    SayHello(); 

    return 0; 
} 


void SayHello(void) { 
    printf("Hello, world!\n"); 
} 
+9

Tôi ngạc nhiên rằng cuốn sách không làm được điều này! Bạn sẽ nhận được một cuốn sách tốt hơn. – bobbyalex

+0

Tôi sẽ nhảy trong cùng một chuyến tàu: có được một cuốn sách tốt hơn .... – DFectuoso

+0

cũng toàn bộ mã không phải là tất cả trong cuốn sách. Tôi chỉ muốn ai đó giải thích từng dòng. –

Trả lời

38

tôi sẽ đề nghị nhận được một cuốn sách khác nhau, bởi vì nó có lẽ đã nói với bạn bây giờ. Tuy nhiên, hãy để cho nó!

#include <stdio.h> 

phần Điều đó nói với các "preproccesor" (một phần của trình biên dịch mà đi qua và nhận được mọi thứ sẵn sàng để được biên soạn) để lấy nội dung của file "stdio.h" trong một số bộ phận đặc biệt của máy tính của bạn, và đặt nó lên trên mã nguồn của bạn. Bằng cách này, trình biên dịch có thể biết về hàm printf bên dưới, những gì nó cần cho các đối số và giá trị nó trả về (trả về sau khi nó kết thúc).

void SayHello(void); 

Phần này tuyên bố chức năng. Bằng cách đặt định nghĩa lên đó, bạn có thể gọi hàm trước khi thực hiện nó. Chức năng "header" này cho trình biên dịch biết rằng sẽ có một hàm trả về void (tức là không có gì. Sau khi nó kết thúc, không có giá trị nào được trả về. Ví dụ: bạn không thể viết int a = SayHello();, vì không có gì được trả lại từ SayHello()). Nó cũng không có đối số. Vì vậy, bạn không thể viết SayHello(34), bởi vì nó có các đối số trống, có nghĩa là không có.

int main (int argc, const char * argv[]) { 

Phần này là bắt đầu của hàm "chính".Chức năng main là nơi máy tính của bạn bắt đầu chương trình. Đây là điểm khởi đầu. Phải mất hai đối số; số lượng đối số (int argc) được truyền vào trên dòng lệnh (hiện tại) và một "mảng" của "chuỗi (char *)". Một mảng chứa danh sách cùng loại dữ liệu. Vì vậy, bạn có thể có một "mảng" của char *. Nếu bạn bắt đầu chương trình của bạn như thế này: ./myProgram fish, argv[1] sẽ giữ các mảng ký tự (char *) "cá". Đừng lo lắng về phần này quá nhiều, cuốn sách của bạn sẽ giải thích nó sau này.

SayHello(); 

Phần này gọi hàm SayHello(). SayHello của tiêu đề ở trên, nhưng chương trình gọi thực hiện thực tế của các chức năng dưới đây. SayHello không có đối số và không trả lại bất kỳ giá trị nào (void). Máy tính tạm thời chuyển sang chức năng SayHello. Khi nó kết thúc, nó trở về chức năng main nơi nó đã tắt. Chúng tôi sẽ đến định nghĩa SayHello thực tế sau.

return 0; 

Hàm main trả về một số nguyên. Nếu mọi thứ đều ổn, return 0; có nghĩa là, chương trình đã thoát một cách duyên dáng.

} // end of the function 

void SayHello(void) { // We already covered this part above 
     printf("Hello, world!\n"); 
} 

Phần này là chức năng thực tế mà chúng tôi đã thực hiện. Mục tiêu của nó là in Hello, world! vào bảng điều khiển. Chúng tôi thực hiện việc này bằng cách gọi một chức năng khác được xác định trong tệp stdio.h mà chúng tôi đã bao gồm. Tên của nó là printf. Phải mất một số lượng khác nhau của chuỗi (điều này sẽ được bảo hiểm nhiều hơn sau này trong cuốn sách của bạn), và in ra bàn điều khiển. Cuốn sách của bạn có lẽ sẽ rất ngắn gọn bao gồm printf đầy đủ. Bây giờ, tất cả những gì bạn làm là in một chuỗi đơn (bạn có thể in nó bằng một định dạng như sau: printf("My Num is: %d",34); thay thế %d với 34. Tuy nhiên, bây giờ, hãy nhớ rằng nó in một chuỗi. !" theo sau là một dòng mới (\n) printf trả về một int;. nhưng nó chỉ dành riêng cho mục đích khôi phục lỗi Sau printf kết thúc, nó sẽ trả cho SayHello chức năng, sau đó kết thúc và trở về main, mà kết thúc và trả về 0

..

Tôi hy vọng điều này giải thích mọi thứ độc đáo!

+0

Bạn có thể đề cập rằng vì không sử dụng argc hay argv, định nghĩa thay thế của chính sẽ bắt đầu: int main (void). Nếu không, một câu trả lời tốt. –

+0

Ah, đó sẽ là một điều tốt để đề cập đến! Nếu tôi có đủ Đại diện, tôi sẽ tiếp tục và thêm vào đó. – micmoo

+1

Bạn luôn có thể chỉnh sửa các câu hỏi và câu trả lời của riêng bạn. Không yêu cầu đại diện. –

10

Tôi hy vọng các mã nhận xét sau đây sẽ giúp ích cho bạn:

#include <stdio.h> // Include the header file named `stdio.h` 

void SayHello(void); // Function named `SayHello` has been declared. It takes no (void) parametres. 

int main (int argc, const char * argv[]) { // `main()` function is part of all C/C++ programs. It accepts command line arguments and returns an exit code. In this case, it returns an integer exit code. 
    SayHello(); // Call the function named `SayHello` 

    return 0; // Return from the `main()` function with the code 0 (success). 
} 

void SayHello(void) { // Definition of function `SayHello`. 
    printf("Hello, world!\n"); // Use the `printf()` function in `stdio.h` header file to print the message. 
} 
+4

Hầu hết các nhận xét mã nguồn này không giải thích mục đích của mã, nhưng chỉ dịch mã sang tiếng Anh, có hiệu quả khi nói mã đang làm gì, để người đọc không hiểu rõ hơn. nhận xét của micmoo, mặt khác (chính tả và ngữ pháp sang một bên), mang lại ý nghĩa cho mỗi dòng. micmoo giải thích trong khi Alan dịch. –

+0

@Thangalin: Bạn nói đúng. Tôi đã rephrased và tái cơ cấu bài viết của micmoo. –

3

Giải thích ...

void SayHello(void); 

Dòng này là một nguyên mẫu hàm. Việc thiếu mã là cố ý. Đó là một cách để ngôn ngữ C nói rằng sẽ có một hàm tại một số điểm sau đó khớp với chữ ký này. C là trình biên dịch từ trên xuống nên nó phải biết cấu trúc của hàm trước khi nó có thể sử dụng nó.

int main (int argc, const char * argv[]) { 

Đây là khai báo chức năng chính. Các đối số dòng lệnh cho chương trình được chứa trong tham số argv. Tham số argc ghi chú số lượng đối số sẽ có trong tham số argv.

SayHello(); 

cuộc gọi chức năng SayHello đi qua không có thông số

return 0; 

Kết thúc chương trình bằng cách trở về 0 mà là một dấu hiệu cho thấy chương trình đã thành công.

void SayHello(void) { 

Đây là chữ ký định nghĩa hàm. Nó đại diện cho sự khởi đầu của một hàm do người dùng định nghĩa.

printf("Hello, world!\n"); 

Điều này sẽ in nội dung "Xin chào, thế giới!" tiếp theo là một dòng mới vào giao diện điều khiển.

1

Filler nên dòng tiếp theo được công nhận là một khối mã

#include <stdio.h> 

này nói, "tìm kiếm trong đường dẫn trình biên dịch tìm kiếm bao gồm file cho file 'stdio.h', và chèn các nội dung của file ở đây. Lưu ý rằng điều này xảy ra trước khi trình biên dịch thậm chí nhìn thấy nó

void SayHello(void); 

. đây là một nguyên mẫu chức năng. nó chủ yếu nói "sẽ có một chức năng được xác định phù hợp với chữ ký này.

int main (int argc, const char * argv[]) { 
    SayHello(); 

Đây gọi là chức năng được đề cập ở trên. Khi điều này đạt được, việc thực hiện đi vào phần thân của hàm và trả về khi hàm kết thúc.

return 0; 

Giá trị 0 được trả về hệ thống (có nghĩa là không có lỗi, theo quy ước) và thoát chương trình. }

void SayHello(void) { 
    printf("Hello, world!\n"); 

Điều này gọi hàm chuẩn của thư viện chuẩn printf và in chuỗi đã cho.

} 
3
#include <stdio.h> 

Bao gồm thư viện đầu vào/đầu ra tiêu chuẩn.

void SayHello(void); 

Xác định hàm có tên SayHello, không trả về giá trị và không có đối số. Không có xác định nào ở đây - nó sẽ được định nghĩa sau.

int main (int argc, const char * argv[]) { 

Xác định hàm khác, có tên chính. Đây là điểm vào chương trình của bạn. Nó lấy 2 đối số - một số nguyên có tên argc (số đối số dòng lệnh), và mảng const char * có tên argv (đối số dòng lệnh). Bắt đầu cơ thể.

SayHello(); 

Gọi phương thức SayHello mà chúng tôi đã xác định trước đó (chạy các câu lệnh bên trong).

return 0; 

Trả về 0 (thành công) quay lại hệ điều hành.

} 

Kết thúc phần chính().

void SayHello(void) { 

Bắt đầu nội dung của hàm SayHello được xác định trước đó.

printf("Hello, world!\n"); 

In "Hello, world!" vào màn hình. Hàm printf xuất phát từ thư viện đầu vào/đầu ra tiêu chuẩn mà chúng tôi đã đưa vào trước đó.

} 

Kết thúc nội dung SayHello().

Kết quả của chương trình này sẽ là:

Hello, World! 
6
#include <stdio.h> 

Dòng này cho người khiếu nại biết bao gồm header filestdio.h cung cấp các khai báo chuyển tiếp chương trình cho các thường trình nhập/xuất chuẩn trong C Standard Library.

void SayHello(void); 

Đây là forward declaration hoặc function prototype cho hàm. Một khai báo chuyển tiếp là một cách để báo cho trình biên dịch biết rằng sau này một hàm sẽ được định nghĩa nhưng bạn muốn nó biết về nó ngay bây giờ để bạn có thể sử dụng nó. Hàm cụ thể này có tên là SayHello, nó không chấp nhận tham số và nó không trả về một giá trị.

int main(int argc, const char *argv[]) { 

Dòng này chỉ ra rằng định nghĩa của một hàm có tên main. Hàm main là nơi bắt đầu thực hiện chương trình. Hàm này chấp nhận hai tham số: argc thuộc loại intargv là một mảng constchar *.Các thông số argcargv đại diện cho command-line arguments. Tham số argc đại diện cho số đối số dòng lệnh và argv đại diện cho các đối số dòng lệnh thực tế. Đầu dòng, int, chỉ định rằng hàm main trả về giá trị loại int. Điều phân biệt dòng này với dòng trước đó là nó không kết thúc bằng dấu chấm phẩy (;) và được theo sau bởi một dấu ngoặc mở ({).

SayHello(); 

Dòng mã này gọi hàm có tên SayHello. Hàm này đã được khai báo trước đó, nhưng không được xác định.

return 0; 

dòng mã này làm cho main chức năng để trả lại giá trị int0. Bất kỳ người gọi nào của main sẽ nhận được giá trị trả lại là 0.

} 

Dòng mã này cho trình biên dịch biết rằng chúng tôi đang ở cuối định nghĩa main.

void SayHello(void) { 

Với dòng mã này bạn đang nói với trình biên dịch rằng những gì sau là định nghĩa của hàm SayHello rằng đã hứa trước đó trong dòng hai.

printf("Hello, world!\n"); 

Dòng mã này gọi hàm đầu vào/đầu ra tiêu chuẩn printf là một phần của C Standard Library. Hàm printf làm cho đầu ra được hiển thị trên thiết bị đầu cuối; nó là một định tuyến khá linh hoạt để định dạng và hiển thị văn bản trên thiết bị đầu cuối. Ở đây, bạn đang chuyển một tham số, chuỗi "Hello, world!\n". Chuỗi này kết thúc bằng một số escape character (\n) được dịch sang một số newline. Gọi printf với tham số "Hello, world!\n" sẽ gây

Hello, world! 

được hiển thị trên các thiết bị đầu cuối.

} 

Dòng mã này cho trình biên dịch biết rằng chúng tôi đang ở cuối định nghĩa SayHello.

Tóm lại, các dòng mã lệnh cho trình biên dịch bao gồm các khai báo của các phương thức trong các thủ tục nhập/xuất chuẩn của thư viện chuẩn C (các định nghĩa sẽ được liên kết sau bởi linker), khai báo hàm SayHello, xác định hàm main được gọi khi chương trình được thực thi và xác định hàm có tên SayHello. Hàm main gọi hàm SayHello và trả về giá trị int0. Hàm SayHello làm cho dòng

Hello, world! 

để hiển thị trên thiết bị đầu cuối.

Khi chương trình thực hiện, thực hiện sẽ bắt đầu trong hàm main mà gọi hàm SayHello mà in trên thiết bị đầu cuối chuỗi "Hello, world!" Tiếp theo một dòng mới và sau đó trở về main mà trả về int giá trị từ 0 đến người gọi.

2

#include "stdio.h" < - chèn một C++ tập tin vào tập tin này, từ một số vị trí thư mục chưa biết. Yêu cầu chương trình được liên kết với một số thư viện stdio.lib, thường được thêm vào liên kết chương trình theo mặc định.

MyType SayHello (void); < - khai báo hàm trả về MyType-class-instance và không có đối số

MyType SayHello(); < - cùng một điều

MyType SayHello (0); < - tạo MyType-class-instance với số nguyên 0 được truyền vào hàm tạo của lớp.

void SayHello(); < - Tờ khai chức năng trở về không có gì (không có trở lại-báo cáo bên trong)

argc/argv < - chữ viết tắt ngu ngốc cho "đếm luận" và "vector tranh cãi"

trống SayHello() {... } < - mã được biên dịch trong tệp nhị phân của chương trình, có thể được gọi bởi bất kỳ ai biết khai báo hàm này.

printf ("Xin chào, thế giới! \ N"); < - chuyển đến địa chỉ bộ nhớ của hàm printf, với một đối số chuỗi.

7

Mỗi dòng có ý nghĩa gì?

// Include the Standard Input/Output Header to use its declared functions, ... 
#include <stdio.h> 

// Declare a function that takes no parameters and doesn't return a value. 
void SayHello(void); 

// Declare the main function which takes the program's character string 
// arguments and returns an integer error code. 
int main (int argc, const char * argv[]) { 
    // Call the above declared function with no parameters. 
    SayHello(); 

    // Return the error code for OK to tell the OS everything went fine. 
    return 0; 
} 

// Define a function that takes no parameters and doesn't return a value. 
void SayHello(void) { 
    // Print a (constant) character string to the console that says Hello, world! 
    // and places the cursor on the next line. 
    printf("Hello, world!\n"); 
} 

Tài liệu tham khảo

Mã đang được thực thi như thế nào?

  • Ai đó khởi động ứng dụng, bằng cách sử dụng dòng lệnh hoặc phím tắt.
  • Chức năng chính được gọi và đưa ra các tham số của dòng lệnh hoặc phím tắt.
  • Chức năng chính gọi thủ tục SayHello.
  • Quy trình SayHello in dòng Hello, world! và chuyển sang dòng tiếp theo.
  • Quay lại quy trình chính, chúng tôi kết thúc ứng dụng bằng cách trả lại mọi thứ đều OK.

Tính năng này hoạt động như thế nào?

Bạn có lẽ không nên xem xét chi tiết tại thời điểm này, khi bạn cảm thấy bạn sẵn sàng hiểu sâu hơn về những gì đang diễn ra, bạn có thể đọc phần "Ngăn xếp trong hành động" của LearnCPP: The Stack and the Heap.

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