Что означает int main void
Разница между int main() и int main (void)?
Что означает следующее:
Я думаю, что int main() <. >означает, что main не получает никаких параметров (из командной строки):
Но что означает int main(void) <. >? что означает void?
Я посмотрел здесь, но это как-то другой вопрос.
ОТВЕТЫ
Ответ 1
В C разница сомнительна. Некоторым нравится утверждать, что последняя версия (без void ) технически является просто общим расширением реализации и не гарантируется работой по стандарту из-за формулировки в стандарте. Однако в стандарте четко указано, что в определении функции пустой набор параметров имеет четко определенное поведение: функция не принимает никаких параметров. Таким образом, такое определение для основного соответствует следующему описанию в стандарте:
Он [основной] должен быть определен с типом возврата int и без параметров.
Однако существует заметная разница между ними: а именно, версия без void не может обеспечить правильный прототип функции:
О, и просто чтобы быть полным: void имеет во всех деклараторах функций следующее значение:
(6.7.6.3p10) Частный случай неименованного параметра типа void как единственного элемента в списке указывает, что функция не имеет параметров.
Ответ 2
Ответ 3
Ответ 4
В С++ нет разницы, оба одинаковы.
Ответ 5
Прежде всего, существует разница в том, что разрешено для размещенных систем и автономных систем, как показанных здесь.
Для размещенных систем, 5.1.2.2.1 применяется запуск программы:
Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототип для этой функции. Он определяется с типом возврата int и без Параметры:
. (больше текста следует в отношении стилей argv/argc и т.д.).
10 Частный случай неименованного параметра типа void как единственного элемента в списке указывает, что функция не имеет параметров.
Использование деклараторов функций с пустыми скобками (не деклараторы типов параметров прототипа) является устаревшей функцией.
И вот в чем разница. Являясь объявлением функции, int main() является плохой стиль из-за вышеизложенного, так как он не гарантированно работает в следующей версии стандарта C. Он помечен как устаревшая функция в C11.
В С++ обе формы полностью эквивалентны, но там int main() является предпочтительным стилем для субъективных, косметических соображений (Bjarne Stroustrup говорит так. что, вероятно, довольно плохое объяснение, почему вы делаете что-то определенным образом).
Ответ 6
Ответ 7
Ответ 8
Я знаю, что поток старый, но несколько лет назад этот вопрос беспокоил меня, поэтому я хотел бросить свою половину процента (если это).
Я всегда рассматриваю функции C, как если бы они фиксировали количество аргументов независимо от контекста, если только они не используют va_args. То есть, я верю, что ВСЕГДА имеют прототип:
даже если аргументы не переданы, функция имеет эти аргументы в стеке, потому что основная функция не имеет перегрузки функций.
C имеет возможность иметь примитивную перегрузку, просто делая вид, что аргумент отсутствует. В этом случае аргумент все еще передается и находится в стеке, но вы никогда не обращаетесь к нему, поэтому он просто уменьшает размер исходного кода.
Высказывание int main() просто означает, что я знаю, что функция может иметь параметры, но я их не использую, поэтому я пишу int main().
Высказывание int main (void) говорит о том, что main НЕКОТОРНО не имеет аргументов и подразумевает наличие двух разных прототипов функций:
Так как C не имеет функции перегрузки, это несколько вводит меня в заблуждение, и я не доверяю коду с основным (void) в нем. Я бы не стал, если main NEVER принял какие-либо параметры, и в этом случае main (void) будет полностью в порядке.
ПРИМЕЧАНИЕ. В некоторых реализациях есть больше параметров в основном, чем argc и argv, таких как env, но это меня не беспокоит, потому что я знаю, что я не говорю прямо, что это только два параметра, но это минимальные параметры, и все в порядке, чтобы иметь больше, но не меньше. Это противоречит прямому утверждению int main (void), который кричит на меня, поскольку ЭТОТ ФУНКЦИЯ НЕТ ПАРАМЕТРОВ, что неверно, поскольку это так, они просто опускаются.
Вот мой базовый код:
./sample У меня явно есть аргументы
У функции явно есть аргументы, переданные ей, несмотря на то, что она явно не говорит о том, что она не набирает void в прототип функции.
(6.7.6.3p10) Частный случай неименованного параметра типа void как только элемент в списке указывает, что функция не имеет параметров.
Таким образом, говоря, что функция имеет пустоту как аргумент, но фактически наличие аргументов в стеке является противоречием.
Моя точка зрения заключается в том, что аргументы все еще существуют, поэтому явное утверждение о том, что main не содержит аргументов, является нечестным. Честным способом было бы сказать int main(), который не утверждает ничего о том, сколько параметров у него есть, только о том, сколько параметров вам нужно.
ПРИМЕЧАНИЕ2: _argc, _pargv зависят от системы, чтобы найти ваши значения, которые вы должны найти, запустив эту программу:
Эти значения должны оставаться правильными для вашей конкретной системы.
Разница между int main () и int main (void)?
что означает следующее:
думаю, что int main() <. >означает, что main не получает никаких параметров (из командной строки), однако:
8 ответов:
В C, разница сомнительна. Некоторые любят утверждать, что последняя версия (без void ) технически является просто общим расширением реализации и не гарантирует работу по стандарту из-за формулировки в стандарте. Однако в стандарте четко указано, что в определении функции пустой набор параметров, имеет четко определенные поведение: что функция не принимает никаких параметров. Таким образом такая определение для main соответствует следующему описанию в стандарте:
Он [main] должен быть определен с возвращаемым типом int и без параметров.
существует, однако, заметная разница между ними: а именно, версия без void не удается предоставить правильный прототип для функции:
О, и просто, чтобы быть полным: void имеет следующее значение во всех деклараторах функций:
(6.7.6.3p10) частный случай неназванного параметра типа void в качестве единственного элемента в списке указывает, что функция не имеет параметров.
В C++ нет никакой разницы, оба одинаково.
прежде всего, есть разница в том, что разрешено для размещенных систем и автономных систем, как показано здесь.
для размещенных систем, 5.1.2.2.1 запуск программы применяется:
функция, вызываемая при запуске программы, называется главным. Реализация объявляет нет прототип для этой функции. Он должен быть определен с типом возврата int и без параметры:
. (далее следует текст что касается стилей argv / argc и т. д.).
интересная часть «без параметров». int main() и int main (void) в настоящее время эквивалентны, так как они оба являются деклараторами функций и не имеют параметров. Применяется следующее (6.7.6.3):
10 частный случай неназванного параметра типа void в качестве единственного элемента в списке указывает, что функция не имеет параметров.
14 список идентификаторов объявляет только идентификаторы параметров функции. пустой список в деклараторе функций, который является частью определения этой функции, указывает, что функция не имеет параметров. пустой список в деклараторе функций, который не является частью определение этой функции указывает, что нет информации о количестве или типах параметров входит в комплект поставки.145)
использование деклараторов функций с пустыми скобками (не деклараторы типа параметров прототип-формат) является устаревшей функцией.
и вот в чем разница. Будучи декларатором функций, int main() и плохой стиль из-за вышеизложенного, так как он не гарантированно работает в следующей версии стандарт C. Он помечается как устаревшая функция в C11.
в C++ обе формы полностью эквивалентны, но есть int main() является предпочтительным стилем по субъективным, косметическим причинам (так говорит Бьярне Страуструп. что, вероятно, является довольно плохим обоснованием для объяснения того, почему вы делаете что-то определенным образом).
Я знаю, что нить старая, но этот вопрос беспокоил меня некоторое время несколько лет назад, поэтому я хотел бросить свои полцента(если это так).
Я всегда рассматриваю функции C, как если бы они имели фиксированное количество аргументов независимо от контекста, если они не используют va_args. То есть, я доверяю main, чтобы всегда иметь прототип:
даже если аргументы не передаются, функция имеет эти аргументы в стеке, потому что основная функция не имеет функции перегрузка.
C имеет возможность иметь примитивную перегрузку, просто притворяясь, что аргумента нет. В этом случае аргумент все еще передается и находится в стеке, но вы никогда не обращаетесь к нему, поэтому он просто уменьшает размер исходного кода.
говоря int main () просто означает, что я знаю, что функция может иметь параметры, но я не использую их, поэтому я пишу int main ().
говоря int main (void) говорит, что main, конечно, не имеет аргументов, и подразумевает, что существуют два разных прототипа функций:
поскольку C не имеет перегрузки функций, это несколько вводит меня в заблуждение, и я не доверяю коду, который имеет main(void) в нем. Я бы не стал, если main никогда не принимал никаких параметров, и в этом случае main(void) будет полностью в порядке.
примечание: в некоторых реализациях есть больше параметров в main, чем argc и argv, таких как env, но это меня не беспокоит, потому что я знаю, что я явно не говорю, что это только два параметра, но это минимальные параметры, и это нормально иметь больше, но не меньше. Это в отличие от прямого высказывания int main (void), которое кричит на меня, поскольку эта функция не имеет параметров, что неверно, поскольку это так, они просто опущены.
вот мой базовый код:
./ пример у меня явно есть аргументы
функция явно имеет аргументы, переданные ей, несмотря на то, чтобы явно сказать, что это не происходит путем ввода void в прототип функции.
(6.7.6.3p10) частный случай неназванного параметра типа void в качестве единственный пункт в списке указывает, что функция не имеет параметров.
таким образом, говоря, что функция имеет void в качестве аргумента, но на самом деле имея аргументы в стеке является противоречием.
моя точка зрения заключается в том, что аргументы все еще существуют, поэтому явно утверждая то, что главное лишено аргументов-это нечестно. Честным способом было бы сказать int main(), который ничего не утверждает о том, сколько параметров у него есть, только о том, сколько параметров вы заботитесь.
NOTE2: _argc, _pargv зависят от системы, чтобы найти свои значения, вы должны найти их, запустив эту программу:
эти значения должны оставаться правильными для вашей конкретной системы.
аргументы Main-Function-и-Command-Line-«> main функции и аргументов командной строки
main Функция не имеет объявления, так как она встроена в язык. Если это так, синтаксис объявления для main будет выглядеть следующим образом:
Стандартные аргументы командной строки
Аргументы для main обеспечения удобного анализа аргументов в командной строке. Типы для параметров argc и argv определяются языком. Имена argc и argv являются традиционными, но их можно называть по своему усмотрению.
Используются следующие определения аргументов.
Сведения о подавлении обработки в командной строке см. в разделе Настройка обработки командной строки C++.
Расширения, относящиеся к Microsoft
В следующих разделах описывается поведение, характерное для Майкрософт.
Как расширение Майкрософт, main w main функции и могут быть объявлены как возвращаемые void (без возвращаемого значения). Это расширение также доступно в некоторых других компиляторах, но его использование не рекомендуется. Он доступен для симметрии, если main не возвращает значение.
main w main Сигнатуры или позволяют дополнительному расширению для доступа к переменным среды, относящимся к Microsoft. это расширение также распространено в других компиляторах для Windows и UNIX систем. Имя envp является традиционным, но вы можете присвоить параметру среды любое имя. Ниже приведены эффективные объявления для списков аргументов, включающих параметр среды:
Main «>примеры аргументов main
В следующем примере показано, как использовать argc аргументы, argv и envp в следующих main случаях:
Анализ аргументов командной строки C++
Правила синтаксического анализа командной строки, используемые кодом Microsoft C/C++, специфичны для Microsoft. Код запуска среды выполнения использует эти правила при интерпретации аргументов, заданных в командной строке операционной системы:
Аргументы разделяются пробелами (пробел или табуляция).
Строка, заключенная в двойные кавычки, интерпретируется как один аргумент, который может содержать пробелы в char актерс. Строку в кавычках можно встроить в аргумент. Курсор ( ^ ) не распознается как escape- char актер или разделитель. Внутри заключенной в кавычки строки пара двойных кавычек интерпретируется как одна экранированная двойная кавычка. Если командная строка заканчивается до тех пор, пока не будет найдена закрывающая двойная кавычка, то все char прочитанные актерс будут выводиться в качестве последнего аргумента.
Символ двойной кавычки после обратной косой черты ( \» ) интерпретируется как литеральный символ двойной кавычки ( « ).
Символы обратной косой черты считаются литералами, если сразу за ними не стоит двойная кавычка.
Если двойная кавычка стоит после четного числа символов обратной косой черты, в массив argv помещается по одному символу обратной косой черты ( \ ) для каждой пары символов обратной косой черты ( \\ ), а сама двойная кавычка ( « ) интерпретируется как разделитель строк.
Пример синтаксического анализа аргументов командной строки
В следующем примере программы показана передача аргументов командной строки:
Результаты синтаксического анализа командных строк
В следующей таблице показаны примеры входных данных и ожидаемые выходные данные, иллюстрирующие применение правил из приведенного выше списка.
Входные данные командной строки | argv [1] | argv [2] | argv 3-5 |
---|---|---|---|
«abc» d e | abc | d | e |
a\\b d»e f»g h | a\\b | de fg | h |
a\\\»b c d | a\»b | c | d |
a\\\\»b c» d e | a\\b c | d | e |
a»b»» c d | ab» c d |
Развертывание подстановочных знаков
Кроме того, компилятор Майкрософт позволяет использовать подстановочныйзнак актерс, вопросительный знак ( ? ) и звездочку ( * ), чтобы указать аргументы filename и Path в командной строке.
Дополнительные сведения о параметрах компоновщика для запуска среды выполнения см. в статье Параметры ссылок.
Настройка обработки командной строки C++
Программа может вызывать семейство подпрограмм spawn или exec в библиотеке среды выполнения C. В этом случае не следует подавлять подпрограмму обработки среды, так как она используется для передачи данных о среде из родительского процесса в дочерний.
УРОК 2. БОЛЕЕ ВНИМАТЕЛЬНЫЙ ВЗГЛЯД НА C++
В уроке 1 вы создали несколько программ на C++. В то время ваша цель заключалась в том, чтобы понять процесс создания и компиляции программ на C++, а не в том, чтобы понять операторы C++. В данном уроке вы впервые более внимательно рассмотрите операторы, из которых состоит программа на C++. Вы увидите, что большинство программ на C++ придерживаются одного и того же формата: начинаются с одного или нескольких операторов # include, содержат строку void main(void), а затем набор операторов, сгруппированных между левой и правой фигурными скобками. Из этого урока вы поймете, что эти несколько запугивающие операторы реально очень просто освоить. К концу данного урока вы изучите следующие основные концепции:
ВЗГЛЯД НА ОПЕРАТОРЫ ПРОГРАММЫ
В уроке 1 вы создали на C++ программу FIRST.CPP, которая содержала следующие операторы:
В данном случае программа содержит три оператора. Фигурные скобки (называемые группирующими символами) группируют связанные операторы:
В следующем разделе каждый из операторов программы описывается более подробно.
ПРЕДСТАВЛЕНИЕ ОБ ОПЕРАТОРЕ #include
Каждая программа, представленная в уроке 1, начинается со следующего оператора # include:
При создании программ на C++ вы получаете преимущества от использования операторов и определений, которые обеспечивает вам компилятор. При компиляции программы оператор # include заставляет компилятор включить содержимое заданного файла в начало вашей программы. В данном случае компилятор включит содержимое файлаiostream.h.
Файлы с расширением h, которые вы включаете в начало (или заголовок)вашей программы, называются заголовочными файлами. Если вы посмотрите на каталог, содержащий файлы вашего компилятора, то найдете подкаталог с именем INCLUDE, в котором находятся разные заголовочные файлы. Каждый заголовочный файл содержит определения, предоставляемые компилятором для различных операций. Например, существует заголовочный файл, который содержит определения для математических операций, другой заголовочный файл описывает файловые операции и т. д.
Заголовочные файлы представляют собой файлы в формате ASCII, следовательно, вы можете вывести их содержимое на экран или принтер. В данный момент не беспокойтесь о содержимом заголовочных файлов. Просто поймите, что оператор # include позволяет вам использовать эти файлы. Все программы на C++, созданные вами в процессе изучения этой книги, содержат операторы # include, которые вы должны применять в ваших программах.
Каждая создаваемая вами программа на C++ начинается с одного или нескольких операторов #include. Эти операторы указывают компилятору включить содержимое заданного файла (заголовочного файла) в вашу программу, как если бы программа содержала операторы, которые находятся во включаемом файле. Заголовочные файлы содержат определения, используемые компилятором для операций различных типов. Существуют заголовочные файлы, которые определяют операции В/В (ввода/вывода) C++, системные функции (например, функции, возвращающие текущие дату и время) и многое другое.
Заголовочные файлы, подобно программам на C++, представляют собой файлы в формате ASCII, содержимое которых вы можете просмотреть или напечатать. Чтобы лучше понять содержимое заголовочных файлов, найдите время для того, чтобы напечатать заголовочный файл IOSTREAM.H, содержимое которого вы будете использовать в каждой создаваемой вами программе на C++. Обычно заголовочный файл IOSTREAM.H расположен в подкаталоге с именем INCLUDE, который находится в каталоге, содержащем файлы компилятора C++. Используйте текстовый редактор, чтобы просмотреть и напечатать содержимое заголовочных файлов.
Замечание: Никогда не изменяйте содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой создаваемой вами программе.
ЧТО ТАКОЕ void main(void)
При создании программы на C++ ваш исходный файл будет содержать множество операторов. Как вы поймете в процессе изучения, порядок, в котором операторы появляются в программе, не обязательно должен совпадать с порядком, в котором операторы будут выполняться при запуске программы. Каждая программа на C++ имеет один вход, с которого начинается выполнение программы, — главную программу. В программах на C++ оператор void main(void) указывает стартовую точку вашей программы.
По мере того как ваши программы становятся больше и сложнее, вы будете делить их на несколько небольших легко управляемых частей. При этом оператор void main(void) указывает начальные (или главные) операторы программы — часть программы, которая выполняется первой.
Представление о главной программе
Исходные файлы C++ могут содержать очень много операторов. При запуске программы оператор void main(void) определяет главную программу, содержащую первый выполняемый оператор. Ваши программы на C++ должны всегда включать один и только один оператор с именем main.
При рассмотрении больших программ на C++ ищите main, чтобы определить операторы, с которых начинается выполнение программы.
Использование void
Как только ваша программа становится более сложной, вы должны разделить ее на небольшие более легко управляемые части, называемыефункциями. Функция представляет собой простой набор операторов внутри программы, выполняющих определенную задачу. Например, при создании программы платежных документов, вы могли бы создать функцию с именем salary, вычисляющую оклад служащих. Аналогичным образом, если вы пишете математическую программу, вы могли бы создать функции с именами square_root или cube, которые возвращают результат определенных математических операций. Если ваша программа использует функцию, функция выполняет свою задачу и затем возвращает свой результат программе.
Каждая функция в вашей программе имеет уникальное имя. А каждая программа имеет по крайней мере одну функцию. Каждая программа из урока 1 имела только одну функцию с именем main. Урок 9 предоставляет более подробный обзор функций. В данный момент просто имейте в виду, что функция состоит из нескольких связанных по смыслу операторов, выполняющих определенную задачу.
При исследовании различных программ на C++ вы будете постоянно сталкиваться со словом void. Программы используют слово void для указания того, что функция не возвращает значения или не имеет значений, передаваемых в нее. Например, если вы используете среду MS-DOS или UNIX, программа может завершить свое выполнение с возвратом операционной системе значения статуса, которое может быть проверено командным файлом. Командные файлы MS-DOS проверяют выходной статус программы, используя команду IF ERRORLEVEL. Например, предположим, что программа с именем PAYROLL. EXE завершается с одним из следующих выходных значений статуса в зависимости от результата обработки:
Значение статуса | Смысл |
0 | Успех |
1 | Файл не найден |
2 | В принтере нет бумаги |
Внутри командного файла MS-DOS вы можете проверить результат работы программы, используя команду IF ERRORLEVEL:
IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 GOTO SUCCESSFUL
IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 GOTO NO_FILE
IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 GOTO NO_PAPER
REM Далее идут другие команды
Большинство простых программ на C++, которые будут созданы вами в процессе изучения этой книги, не возвращают выходное значение статуса операционной системе. Поэтому вы должны размещать слово void передmain, как показано ниже:
void main (void) //— ——-> Программа не возвращает значение
В следующих уроках вы узнаете, что ваши программы могут использовать информацию (например, имя файла), которую пользователь указывает в командной строке при запуске программы. Если программа не использует информацию командной строки, вы должны разместить слово void внутри круглых скобок после main, как показано ниже:
void main ( void ) //———————-> Программа не использует аргументы командной строки
По мере усложнения ваши программы могут возвращать значения в операционную систему или использовать параметры командной строки. Однако в настоящий момент просто используйте void в операторе с main,как показано в этой программе.
ПРЕДСТАВЛЕНИЕ О ГРУППИРУЮЩИХ ОПЕРАТОРАХ
По мере усложнения в ваших программах будет один набор операторов, которые компьютер должен выполнить определенное число раз, и другой набор операторов, которые компьютер должен выполнить, если выполняется определенное условие. В первом случае компьютер может выполнить один и тот же набор операторов 100 раз, чтобы добавить для 100 студентов тестовые очки. Во втором случае компьютер может вывести на экран одно сообщение, если все студенты прошли тест, и другое сообщение, если один или несколько студентов потерпели неудачу. Внутри своих программ на C++ вы будете использовать правую и левую фигурные скобки <>, чтобы сгруппировать связанные операторы. В простых программах, представленных в нескольких первых уроках книги, эти символы группируют операторы, которые соответствуют операторам вашей главной программы.
ИСПОЛЬЗОВАНИЕ cout ДЛЯ ОТОБРАЖЕНИЯ ВЫВОДА НА ЭКРАН
Все программы на C++, созданные вами в уроке 1, выводили сообщения на экран. Чтобы вывести сообщение, программы использовали cout и двойной знак «меньше» (
Слово cout представляет собой выходной поток, который C++ назначает на стандартное устройство вывода операционной системы. По умолчанию операционная система назначает стандартное устройство вывода на экран дисплея. Чтобы вывести сообщение на экран, вы просто используете двойной символ «меньше» (называемый оператором вставки) с выходным потоком cout. Из урока 3 вы узнаете, что можно использовать оператор вставки для передачи символов, чисел и других знаков на экран.
Представление о выходном потоке cout
Вы уже знаете, что программы на C++ используют выходной поток cout для вывода сообщений на экран. При использовании cout для вывода сообщений представляйте cout в виде потока символов, которые операционная система отображает на экране. Другими словами, порядок, в котором ваша программа посылает символы в cout, определяет порядок символов, которые будут появляться на экране. Например, для следующих операторов программы:
Операционная система выводит поток символов следующим образом:
Это сообщение появляется первым, а за ним следует настоящее сообщение.
Оператор вставки (
Вы уже знаете, что выходной поток cout по умолчанию соответствует вашему экрану. Другими словами, когда ваши программы посылают вывод в cout, вывод появляется на экране. Однако, используя операторы переназначения вывода операционной системы, вы можете послать вывод программы на принтер или в файл. Например, следующая команда предписывает MS-DOS направить вывод программы FIRST.EXE на принтер, а не на экран:
Как вы узнаете из Урока 3, с помощью cout в C++ можно выводить символы, целые числа, например 1001, и числа с плавающей точкой, например 3.12345. Из Урока 8 вы узнаете, что в C++ существует также входной поток с именем cin, который ваши программы могут использовать для чтения информации, вводимой с клавиатуры.
ЧТО ВЫ ДОЛЖНЫ ЗНАТЬ
В этом уроке обсуждались некоторые общие вопросы, с которыми вы столкнетесь в программах на C++. Из Урока 3 вы узнаете, как использовать cout для вывода символов, целых чисел и значений с плавающей точкой. Вы также узнаете, как форматировать вывод. До изучения урока 3 убедитесь, что вы освоили следующие основные концепции: