Recentemente, fiz um teste de programação intermediária e uma das perguntas erradas foi a seguinte:
Um ponto e vírgula (';') não é necessário após uma declaração de função.
Verdadeiro ou falso.
Eu escolhi "false" (e corrija-me se estiver errado porque sinto que estou ficando louco), uma declaração de função é o que você escreve antes da definição (na parte superior do código) para que o compilador conheça a função antes mesmo de chamá-lo, e uma definição de função é o que compõe a função como um todo.
Ou seja,
Declaração:
int func();
Definição:
int func() {
return 1;
}
A resposta não deveria ser falsa?
c++
function
syntax
declaration
Logan
fonte
fonte
Respostas:
Você pode ter uma situação em que declara e define a função em uma etapa, ou seja, se incluir a definição da função no ponto em que a declara. Então, tecnicamente , suponho que true esteja correto. Mas a pergunta está formulada de tal maneira que eu teria respondido da maneira que você fez.
fonte
Além da coisa "uma definição também é uma declaração", o seguinte é C ++ legal:
Isso declara duas funções
f
eg
, ambas sem argumentos e com um tipo de retorno deint
, mas a definição def
não é seguida (imediatamente) por um ponto e vírgula. Da mesma forma, isso é legal:Mas, de fato, não é permitido omitir o ponto-e-vírgula inteiramente nesses casos; portanto, seria algo surpreendente se um deles fosse tomado como exemplo de uma declaração sem o ponto-e-vírgula seguinte. De fato, o seguinte é ilegal:
Além de uma (mera) declaração de função, uma definição de função não pode ser combinada com nenhuma outra declaração ou definição para o mesmo especificador de tipo . (Se isso fosse legal, definiria a
void *p
e avoid f() {}
.)De qualquer forma, esse parece ser um tipo de pergunta "pegadinha" que não deve estar em um teste de programação intermediário.
(Ah, a propósito, por favor, não escreva código como esse
int f(), i = 42;
.)fonte
typedef int fooProc(int); fooProc a,b.c.d.e;
não sei por que os cabeçalhos padrão dos compiladores baseados em unidades de disquete não fizeram isso de volta no dia, pois eu pensaria que isso permitiria que os arquivos de cabeçalho fossem bem menores e, portanto, mais rápidos de processar.int f(int(&g)(),int(*h)()){return g()+h();}
Este possui três declarações de função, uma das quais é seguida por uma chave aberta, outra por vírgula e a terceira por um parêntese próximo.int f(stuff)
. Mesmo no escopo da função,g
é uma variável automática do tipo referência à função eh
é um ponteiro para a função .As outras respostas e comentários apontam várias das muitas maneiras pelas quais essa é uma pergunta horrível, enganosa e mal escrita. Mas há outro problema que ninguém mais identificou ainda. A questão é:
OK, vamos olhar para uma declaração de função:
Essa coisa toda é a declaração . A declaração não é
int func()
e depois é seguida por a;
. A declaração éint func();
e, em seguida, é seguida por espaço em branco.Então, a pergunta é: é necessário um ponto e vírgula após a declaração ? Claro que não. A declaração já possui um ponto-e-vírgula e a encerrou. Um ponto e vírgula após a declaração seria inútil. Por outro lado,
int func(); ;
seria um ponto e vírgula após uma declaração de função .A pergunta quase certamente pretendia fazer a pergunta "verdadeira ou falsa: o último token em uma declaração de função é sempre um ponto e vírgula". Mas essa não é a pergunta que eles escreveram, porque o autor do questionário não estava pensando claramente sobre o problema.
Meu conselho é evitar completamente os testes de linguagem de programação. Eles são horríveis.
Curiosidade, enquanto estamos sobre o assunto. Em C #, tudo isso é legal:
Em C #, uma declaração de classe ou estrutura pode terminar em ponto e vírgula, ou não, a seu critério. Esse pequeno recurso estranho foi adicionado para o benefício dos programadores de C / C ++ que chegam ao C # que têm na ponta dos dedos que as declarações de tipo terminam em ponto e vírgula; a equipe de design não queria puni-los por terem esse hábito. :-)
fonte
Você também pode declarar uma função como esta:
A afirmação é muito ambígua. A resposta certa deve ser: depende de como você declara a função.
Enfim, eu teria escolhido falso também, e talvez você possa relatar a pergunta a alguém.
fonte
Verdadeiro . Um ponto-e-vírgula não é necessário após qualquer declaração. Nem depois de qualquer definição. Nem depois de qualquer declaração.
Muitos tipos de declaração precisam terminar com ponto e vírgula, conforme especifica a sintaxe na seção 7 [dcl.dcl]. Mas nunca há necessidade de escrever um segundo depois disso.
fonte
Isso depende se estamos declarando ou definindo a função. Se estamos declarando a função, precisamos incluir o ponto e vírgula (
;
) e, se estamos definindo a função, o ponto e vírgula não é necessário.Uma declaração é assim:
E uma definição é assim:
fonte
Embora eu concorde com quase todas as outras respostas, afirmando que a pergunta é redigida de forma muito ambígua e que sua resposta é tecnicamente correta, permita-me dar uma perspectiva diferente:
É assim que eu sempre os chamei:
Estou assumindo que a pergunta foi feita com essa terminologia em mente.
Definição e declaração são o mesmo conceito aos meus olhos. "Eu defino x = y" == "Declaro x = y".
Mas é claro que há uma grande diferença entre o protótipo da função (na parte superior) e a definição real da função.
fonte
void func();
são exatamente equivalentes avoid func(void);
. Isso é muito diferente de C , ondevoid func();
não diz nada ao compilador sobre os argumentos e não é a mesma coisa quevoid func(void);
. Um protótipo ou definição posterior é uma boa idéia; caso contrário, o chamador deve aplicar as promoções arg padrão (por exemplo, tipos inteiros float -> double e narrow paraint
. As mesmas regras que args para funções variadas.)É uma pena que a pergunta que você fez não diga "diretamente depois". Por exemplo, poderíamos escrever isso:
Ou eu poderia escrever:
No primeiro caso, o ponto-e-vírgula não está diretamente após a declaração, mas seria bom.
No segundo caso, há um ponto e vírgula "após" a declaração, mas não diretamente após.
Acho que Eric Lippert tem a idéia certa em sua resposta .
É como dizer "deve haver um período após o final de uma frase em inglês?". Indiscutivelmente, uma frase já tem um ponto final no final (caso contrário, não seria uma frase) e, portanto, não deve haver um período após a frase.
fonte
int func() int a=42;
não compila. Você precisa de uma vírgula, não de outraint
. Veja a resposta de @ Arne postada mais de um dia antes disso. A única coisa nova nesta resposta é o último parágrafo, com a analogia das frases em inglês.Você pode usar
;
apenas para protótipos.fonte
É uma pergunta meio complicada, mas eles usaram a palavra declaração, que significa algo como isto:
Então é verdade neste caso.
Se eles usassem a palavra implementação , isso seria falso.
fonte
O ponto e vírgula (;) é usado para informar ao compilador que após esse ponto e vírgula (;) uma nova instrução é iniciada.
Então, acho que o ponto e vírgula (;) é necessário apenas durante uma declaração de função. Então, de acordo com mim, a resposta será verdadeira.
fonte
Quando as funções são definidas antes de main () :
Quando as funções são definidas após main () :
fonte