Pergunta

Muitas vezes em ANSI C código eu posso ver parêntese sorrounding um único valor de retorno.

Assim: -

int foo(int x) {
  if (x)
    return (-1);
  else
    return (0);
}

Por que usar () em torno do valor de retorno nesses casos? Alguma ideia? Não vejo qualquer razão para isso.

Foi útil?

Solução

Não há realmente uma razão ... é convenção apenas de idade.

Para economizar espaço, os programadores muitas vezes fazer as contas final na linha de retorno em vez de, por si própria linha e os parênteses assegurar são principalmente lá para torná-lo mais fácil de ver que é uma única instrução que é retornado, como este:

return (x+i*2);

em vez de

int y = x+i*2;
return y;

O parêntese tornou-se um hábito e ele ficou preso.

Outras dicas

A prática, mas improvável, o motivo é se você colocar parênteses em torno do valor, você pode definir o retorno como uma macro, e em seguida, insira um código de registro para assistir todos os seus retornos.

Meu estilo pessoal é a de parênteses uso se houver uma expressão complexa; por exemplo.,

return (a + b);

mas não usá-los se a expressão é um termo simples

return a;

Eu não posso dizer porque eu fazê-lo dessa maneira; apenas algo que eu peguei há muito tempo.

A propósito, acho que fazendo com que pareça uma chamada de função, assim:

return(a);  // ugh

é incrivelmente feio e simplesmente errado.

Na especificação original C, foram necessários parênteses em torno do valor de retorno. Enquanto modernos compiladores C e do ANSI C padrão não exigem-los, a presença de parênteses não afeta o valor de retorno, e os programadores, por vezes, ainda incluí-los fora de hábito, falta de familiaridade com os padrões, por consistência com uma convenção estilística que os obriga, ou, eventualmente, para compatibilidade com versões anteriores.

Devo acrescentar, para as pessoas que estão pensando em C ++: Este pergunta é sobre C e C não é C ++; estas são duas línguas diferentes, com diferentes padrões, capacidades, níveis de dificuldade, e diferentes estilos de uso que emergem - tudo o que eles têm em comum, é aconselhável tratá-los como duas coisas totalmente distintas. Para uma pergunta semelhante que cobre C ++, consulte Tem parênteses em torno do resultado significativo em uma instrução de retorno? .

Existem algumas razões:

  1. if / enquanto / para / etc. são todas as palavras-chave de controle que devem ter parens. Por isso, muitas vezes parece natural para sempre colocá-los no retorno também.

  2. sizeof é a única outra palavra-chave que pode tê-los ou não, exceto que em alguns casos você deve uso parens. Por isso é mais fácil de adquirir o hábito de sempre usando parênteses. para sizeof, o que implica uma lógica de:. se você pode, sempre faço

  3. caso / empreendedores são a única palavras-chave em que você nunca usa parênteses. ... e as pessoas tendem a pensar daqueles como casos especiais (e como eles tanto para se destacar de outras palavras-chave de controle, esp. Goto).

Ao retornar -1 como em sua excample, eu acho que é mais legível com o parêntese, porque o menos é mais visível:

return 1

ou

return -1

ou

return (-1)

Talvez seja personalizado - afinal, as pessoas que nos trouxe Unix e C veio do projeto Multics. Multics foi escrito em PL / I, e em PL / I os parênteses são obrigatórios.

Eu tenho trabalhado com pelo menos um programador que pensou retorno foi algum tipo especial de chamada de função, e foi surpreendido quando viu que meu código cumprido sem os parênteses.

Como frequentemente o caso quando se usa parênteses, eu acho que isso é só para leitura (por exemplo, Ruby suporta chamadas de método w / o parêntese colocando os argumentos, mas livros e artigos recentes aconselhar o contrário).

O parêntese em uma instrução de retorno indicar ao compilador que você pretende para este valor a ser devolvido na pilha em vez de na memória.

Nos velhos tempos, isso foi rigorosamente aplicada (tipicamente), mas hoje a maioria dos compiladores única tomá-lo como uma dica.

Este é algo que faço com frequência, já que um erro poderia algo corrupto sendo devolvido por meio de uma referência de memória, mas o efeito não vai tipicamente uma variável a ser retornada na pilha.

Usando a pilha para variáveis ??transitórios também reduz o uso de memória e normalmente faz a chamada de função / retorno mais rápido porque é isso que a pilha é projetado para, dados temporários / variáveis.

Usando parênteses em uma instrução de retorno mostra uma compreensão deficiente da sintaxe C/C++. É simples assim. Mas não é tão mau como colocar tudo dentro de chaves:

int foo(int x) {
  if (x) {
    return (-1);
  }
  else {
    return (0);
  }
}

Assim, muitos programadores fazer isso. Se um de vocês lê este, talvez você gostaria de explicar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top