2016-09-06 3 views
-1
#include<stdio.h> 
#define N 100 

int main(int num, char *argv[]) 
{ 
    while(num <= N && printf("%d\t", num) && num++) 
    {} 
} 

Пытается печатать от 1 до N без точки с запятой. Пришло это решение (см. Ниже), но что происходит с итерационным методом (см. Выше). Что делает указатель символа? В приведенном выше коде, даже если удалить параметр указателя, код работает отлично. Найдено выше решение на сайте.Что такое объявление указателя?

#include <stdio.h> 
#define N 100 

int main(num) 
{ 
    if(num <= N && printf("%d\t", num) && main(num = num + 1)) 
    {} 
} 
+0

В нем содержатся аргументы командной строки. Если вы запустите свою программу с аргументом, то число num будет начинаться с количества переданных аргументов. – matt

+0

'int main (num)' недопустимо, даже если вы укажете тип ('int num'). Подпись 'main' - это' int main (void) 'или' int main (int argc, char * argv []) ' –

+0

http://stackoverflow.com/questions/2108192/what-are-the-valid-signatures -for-cs-main-function –

ответ

1

Если у вас есть

int main(num) 
{ 
... 
} 

типа num по умолчанию для int. Но это уже недействительно, так как неявное правило int было удалено с C99. Таким образом, ваша программа не соответствует стандарту по нескольким подсчетам. Но он, вероятно, работает на большинстве компиляторов, поскольку старое правило все еще используется для более старого кода (C89 и ранее). Но отнюдь не полагайтесь на это.

GCC (gcc -Wall -Wextra -std=c11 -pedantic test.c) предупреждает с:

warning: type of ‘num’ defaults to ‘int’ [enabled by default] 

Другая проблема заключается в том, что подпись main() не является действительным либо. Это не одна из подписей, требуемых стандартом C:

C11, 5.1.2.2.1 запуска программы (N1548 проект):

Функция называется при запуске программы называется основной. Реализация не объявляет прототип этой функции. Она должна быть де определены с типом возвращаемого междунар и без каких-либо параметров:

INT основной (недействительных) {/ * ... * /}

или с двумя параметрами (именуемых здесь как ARGC и ARGV , хотя могут быть использованы любые имена, так как они являются локальными по отношению к функции, в которой они объявлены ):

Int основных (INT ARGC, полукокса ARGV []) {/ ... * /}

или эквивалент 10) или в некоторых других вариантах осуществления Anner.

+0

Я хотел бы добавить, что вы всегда должны * компилировать с активированными предупредительными флагами ('-Wall -Wextra') для GCC, и если у вас есть склонность игнорировать их, то маленький' -Werror' тоже делает хорошие вещи – sokkyoku

0

Функция получает количество аргументов и аргументы, переданные ей при запуске программы, поэтому вы можете получить к ней доступ.

num содержит количество аргументов, argv содержит указатели на аргументы. argv [num] всегда является указателем NULL. Обычно аргументы включают имя самой программы.

0

Стандартные основные() заявления являются:

int main(int argc, char *argv[]) or 
int main(void) 

Main, когда вызывается из операционной системы, в основном получает передается подсчет числа параметров (целое число), и массив строк, соответствующей параметры командной строки. Вы не используете строки; не большой.

То, что вы сделали, - это немного подпортить основную часть; большинство (если не все - не уверены) платформ довольно хорошо, поскольку main() имеет меньше параметров, чем два в объявлении времени (хотя все будет передано в любом случае в стеке), ваша программа просто не будет иметь хороший способ доступа их). Вы переходите к рекурсивным вызовам на main(), с которыми вы уходите, заявив об этом по-фанки.

Кроме того, если вы не укажете тип, C принимает int, и именно поэтому вы избегаете этого (первый var по умолчанию имеет значение int anyway). Большинство компиляторов выплюнет предупреждение об этом как минимум.

Обратите внимание, что если вы запустите программу, как:

./foo bar baz bingo ... (a bunch more) 

Ваш счет начнется в> 1, и т.д.

Это весело рубить, но не писать код, как этот :-)

Смежные вопросы