Можете ли вы объяснить эту программу «Hello world»? - PullRequest
6 голосов
/ 27 июня 2009

Я только начал изучать C, но я не понимаю эту часть кода. Может кто-нибудь объяснить каждую строку кода и что он делает. Спасибо! Пожалуйста, просто ответьте на то, что я сказал, вместо того, чтобы сказать (это должно быть сказано в книге). Спасибо. Надеюсь, вы, ребята, можете мне помочь.

#include <stdio.h>

void SayHello( void );

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

    return 0;
}


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

Ответы [ 8 ]

39 голосов
/ 27 июня 2009

Я бы предложил приобрести другую книгу, потому что она, вероятно, уже должна была рассказать вам. Однако, давайте доберемся до этого!

#include <stdio.h>

Эта часть говорит "preproccesor" (часть компилятора, которая проходит и готовит вещи для компиляции), чтобы взять содержимое файла "stdio.h" в какую-то специальную часть вашего компьютера и поместить его в верх вашего исходного кода. Таким образом, компилятор может узнать о функции printf ниже, что она принимает для аргументов и какое значение она возвращает (возвращает после завершения).

void SayHello( void );

Эта часть объявляет функцию. Поместив определение туда, вы можете вызвать функцию перед написанием ее реализации. Эта функция "header" сообщает компилятору, что будет функция, которая возвращает void (т. Е. Ничего. После ее завершения значение не возвращается. Например, вы не смогли написать int a = SayHello();, потому что ничего вернулся с SayHello()). Это также не принимает никаких аргументов. Таким образом, вы не могли написать SayHello(34), потому что он принимает пустые аргументы, то есть ничего.

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

Эта часть является началом "основной" функции. Функция main - это место, где ваш компьютер ищет запуск программы. Это отправная точка. Требуется два аргумента; количество аргументов (int argc), переданных в командной строке (на данный момент) и «массив» из «строк (char *)». Массив содержит список данных того же типа. Таким образом, вы можете иметь «массив» char *. Если вы запустите свою программу следующим образом: ./myProgram fish, argv[1] будет содержать массив символов (char *) "fish". Не беспокойтесь об этой части, ваша книга объяснит это позже.

SayHello();

Эта часть вызывает функцию SayHello(). Заголовок SayHello выше, но программа вызывает фактическую реализацию функции ниже. SayHello не принимает аргументов и не возвращает никакого значения (void). Компьютер временно переходит на функцию SayHello. По завершении он возвращается к функции main, на которой остановился. Мы вернемся к фактическому SayHello определению позже.

return 0;

Функция main возвращает целое число. Если все прошло хорошо, return 0; значит, программа вышла изящно.

} // end of the function

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

Эта часть - фактическая функция, которую мы сделали. Его единственная цель - вывести Hello, world! на консоль. Это достигается путем вызова другой функции , определенной в файле stdio.h, который мы включили. Его зовут printf. Он принимает различное количество строк (это будет рассмотрено намного позже в вашей книге) и печатает на консоль. Ваша книга, вероятно, очень скоро полностью охватит printf. На данный момент все, что он делает, это печатает одну строку (вы можете сделать так, чтобы она печаталась в таком формате: printf("My Num is: %d",34);, который заменяет %d на 34. Однако сейчас просто помните, что он печатает строку. , он печатает «Hello world!», за которым следует символ новой строки (\n). printf возвращает int, но только для восстановления после ошибок. После завершения printf возвращается к функции SayHello, который затем заканчивается и возвращается к main, который заканчивается и возвращает 0.

Надеюсь, это все хорошо объясняет!

10 голосов
/ 27 июня 2009

Надеюсь, вам поможет следующий код с комментариями:

#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.
}
7 голосов
/ 27 июня 2009

Что означает каждая строка?

// 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" );
}

Ссылки

Как выполняется код?

  • Кто-то запускает приложение, используя командную строку или ярлык.
  • Основная функция вызывается и задается параметрами командной строки или ярлыка.
  • Основная функция вызывает процедуру SayHello.
  • Процедура SayHello выводит строку Hello, world! и переходит на следующую строку.
  • Вернувшись в основную процедуру, мы завершаем приложение, возвращая, что все в порядке.

Как это работает под капотом?

Вы, вероятно, не должны изучать эту деталь в данный момент, когда вы чувствуете, что готовы получить еще более глубокое понимание того, что происходит под рудой, вы можете прочитать раздел «Стек в действии» LearnCPP : Стек и куча .

6 голосов
/ 27 июня 2009
#include <stdio.h>

Эта строка указывает компилятору включить файл заголовка stdio.h, дающий программные предварительные объявления для стандартных процедур ввода / вывода в стандартной библиотеке C .

void SayHello(void);

Это предварительное объявление или прототип функции для функции. Предварительное объявление - это способ сообщить компилятору, что позже будет определена функция, но вы хотите, чтобы она знала об этом сейчас, чтобы вы могли ее использовать. Эта конкретная функция называется SayHello, она не принимает параметров и не возвращает значение.

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

Эта строка указывает на определение функции с именем main. Функция main - это место, где начинается выполнение программы. Эта функция принимает два параметра: argc имеет тип int и argv представляет собой массив const из char *. Параметры argc и argv представляют аргументы командной строки . Параметр argc представляет количество аргументов командной строки, а argv представляет фактические аргументы командной строки. Начало строки, int, указывает, что функция main возвращает значение типа int. Отличие этой строки от предыдущей заключается в том, что она не заканчивается точкой с запятой (;) и сопровождается открывающей скобкой ({).

    SayHello();

Эта строка кода вызывает функцию с именем SayHello. Эта функция была ранее объявлена, но не определена.

    return 0;

Эта строка кода заставляет функцию main возвращать значение int 0. Любой абонент main получит возвращаемое значение 0.

}

Эта строка кода сообщает компилятору, что мы находимся в конце определения main.

void SayHello(void) {

С этой строкой кода вы теперь сообщаете компилятору, что ниже приводится определение функции SayHello, которая была обещана ранее во второй строке.

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

Эта строка кода вызывает стандартную функцию ввода / вывода printf, которая является частью C Standard Library . Функция printf позволяет выводить вывод на терминал; это довольно гибкая маршрутизация для форматирования и отображения текста на терминале. Здесь вы передаете один параметр, строку "Hello, world!\n". Эта строка заканчивается escape-символом (\n), который переводится в символ новой строки . Вызов printf с параметром "Hello, world!\n" вызовет

Hello, world!

должно отображаться на терминале.

}

Эта строка кода сообщает компилятору, что мы находимся в конце определения SayHello.

Короче говоря, строки кода сообщают компилятору о включении объявлений методов в стандартные подпрограммы ввода / вывода стандартной библиотеки C (определения будут связаны позднее с помощью linker ) , объявляет функцию с именем SayHello, определяет функцию main, которая вызывается при выполнении программы, и определяет функцию с именем SayHello. Функция main вызывает функцию SayHello и возвращает значение int 0. Функция SayHello вызывает строку

Hello, world!

должно отображаться на терминале.

Когда программа выполняется, ее выполнение начинается с функции main, которая вызывает функцию SayHello, которая печатает на терминале строку "Hello, world!", за которой следует новая строка, а затем возвращается к main, который возвращает int значение 0 для вызывающего абонента.

3 голосов
/ 27 июня 2009
#include <stdio.h>

Включите стандартную библиотеку ввода / вывода.

void SayHello( void );

Определите функцию с именем SayHello без возвращаемого значения и без аргументов. Здесь не определено тело - оно будет определено позже.

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

Определите другую функцию с именем main. Это точка входа в вашу программу. Он принимает 2 аргумента - целое число с именем argc (количество аргументов командной строки) и массив const char * с именем argv (аргументы командной строки). Запустить тело.

SayHello();

Вызовите метод SayHello, который мы определили ранее (выполните операторы внутри).

return 0;

Вернуть 0 (успешно) обратно в операционную систему.

}

Завершить основной () корпус.

void SayHello( void ) {

Запустить тело функции SayHello, определенной ранее.

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

Печать "Привет, мир!" на экран. Функция printf взята из стандартной библиотеки ввода / вывода, которую мы включили ранее.

}

Завершить тело SayHello ().

Вывод этой программы будет:

Hello, World!
3 голосов
/ 27 июня 2009

Объяснение ...

void SayHello( void );

Эта строка является прототипом функции. Отсутствие кода является преднамеренным. Для языка Си это способ сказать, что в какой-то момент позже появится функция, которая соответствует этой сигнатуре. C - компилятор сверху вниз, поэтому он должен знать структуру функции, прежде чем он сможет ее использовать.

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

Это объявление основной функции. Аргументы командной строки для программы содержатся в параметре argv. Параметр argc отмечает количество аргументов, которые будут в параметре argv.

SayHello();

Вызывает функцию SayHello без параметров

return 0;

Завершает программу, возвращая 0, что указывает на успешное выполнение программы.

void SayHello( void ) {

Это сигнатура определения функции. Он представляет начало пользовательской функции.

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

При этом будет напечатан текст "Привет, мир!" с новой строкой в ​​консоли.

2 голосов
/ 27 июня 2009

# include "stdio.h" <- вставляет другой файл c ++ в этот файл из неизвестного расположения папки. Требует, чтобы программа была связана с некоторой библиотекой stdio.lib, которая обычно добавляется к связыванию программы по умолчанию. </p>

MyType SayHello (void); <- объявление функции, которая возвращает экземпляр класса MyType и не имеет аргументов </p>

MyType SayHello (); <- то же самое </p>

MyType SayHello (0); <- создание экземпляра класса MyType с целым числом 0, переданным в конструктор класса. </p>

void SayHello (); <- объявление функции, не возвращающей ничего (не содержащей внутри оператора return-операторов) </p>

argc / argv <- глупые сокращения для «счетчика аргументов» и «вектора аргументов» </p>

void SayHello () {...} <- код, скомпилированный в двоичном файле программы, который может вызывать любой, кто знает объявление этой функции. </p>

printf ("Привет, мир! \ N"); <- перейти к адресу памяти функции printf с одним строковым аргументом. </p>

1 голос
/ 27 июня 2009

Заполнитель, поэтому следующая строка распознается как блок кода

#include <stdio.h>

Это говорит: «ищите в пути поиска компиляторов поиск включаемых файлов для файла« stdio.h »и вставляйте сюда содержимое файлов. Обратите внимание, что это происходит еще до того, как компилятор его увидит».

void SayHello( void );

Это прототип функции. По сути, он говорит: «Будет определена функция, соответствующая этой сигнатуре.

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

Это вызывает вышеупомянутую функцию. Когда это достигается, выполнение переходит в тело функции и возвращается после завершения функции.

    return 0;

Значение 0 возвращается в систему (что означает отсутствие ошибок по соглашению) и программа завершается. }

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

Это вызывает функцию printf стандартной библиотеки C и печатает данную строку в стандартный вывод.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...