Pergunta

O que eu estou pedindo com relação ao c#, mas eu suponho que é o mesmo na maioria das outras línguas.

Alguém tem uma boa definição de expressões e declarações e quais são as diferenças?

Foi útil?

Solução

Expressão: Algo que avalia para um valor.Exemplo: 1+2/x
Instrução: Uma linha de código que faz algo.Exemplo: GOTO 100

Nos primeiros propósito geral de linguagens de programação como FORTRAN, a distinção foi cristalina.Em FORTRAN, uma declaração foi uma unidade de execução, uma coisa que você fez.A única razão pela qual não foi chamado de uma "linha" foi porque às vezes é dividido em várias linhas.Uma expressão sobre a sua própria, não podia fazer nada...você tinha para atribuir ele a uma variável.

1 + 2 / X

é um erro em FORTRAN, porque ele não faz nada.Você tinha que fazer algo com essa expressão:

X = 1 + 2 / X

FORTRAN não temos uma gramática como a conhecemos hoje—que idéia foi inventado, juntamente com Backus-Naur Form (BNF), como parte da definição de Algol-60.Nesse ponto, o semântica distinção ("tem um valor" versus "fazer algo") foi consagrado no sintaxe:um tipo de frase, foi uma expressão, e o outro era uma declaração, e o analisador pode distingui-los.

Projetistas de linguagens posteriores turva a distinção:eles permitiram sintática de expressões de fazer as coisas, e eles permitiram sintática declarações que tinha valores.A primeira linguagem popular exemplo de que ainda sobrevive é C.Os designers de C percebi que nenhum mal foi feito, se era permitido para avaliar uma expressão e jogar fora o resultado.Em C, cada expressão sintática pode ser feita em uma declaração por remate de um ponto-e-vírgula ao longo do fim:

1 + 2 / x;

é totalmente legítimo declaração, mesmo que absolutamente nada vai acontecer.Da mesma forma, em C, uma expressão pode ter efeitos colaterais—ele pode mudar alguma coisa.

1 + 2 / callfunc(12);

porque callfunc pode apenas fazer algo de útil.

Uma vez que você permitir que qualquer expressão a ser uma declaração, assim como você pode permitir que o operador de atribuição (=) dentro de expressões.É por isso que C permite que você faça coisas como

callfunc(x = 2);

Este avalia a expressão x = 2 (atribuindo o valor de 2 para x) e, em seguida, passa-o (2) para a função callfunc.

Esta desfocagem de expressões e declarações ocorre em todos os C-instrumentos financeiros derivativos (C, C++, C# e Java), que ainda tem algumas instruções (como while), mas que permitem que praticamente qualquer expressão para ser usada como uma declaração (em C# só de atribuição, uma chamada de incremento e decremento expressões podem ser utilizados conforme instruções;ver Scott Wisniewski resposta).

Ter duas "categorias sintáticas" (que é o nome técnico para o tipo de coisa instruções e expressões são) pode levar à duplicação de esforços.Por exemplo, C tem duas formas do condicional, o formulário de declaração

if (E) S1; else S2;

e a forma de expressão

E ? E1 : E2

E às vezes, as pessoas quer a duplicação que não existe:em C padrão, por exemplo, apenas uma instrução pode declarar uma nova variável local—mas esta capacidade é útil o suficiente para que o O GNU compilador C do GNU fornece uma extensão que permite que uma expressão para declarar uma variável local como bem.

Designers de outras línguas não gosto deste tipo de duplicação, e viram logo que se expressões podem ter efeitos colaterais, bem como valores e, em seguida, o sintática distinção entre as afirmações e expressões não é de todo útil—para que eles me livrar dele.Haskell, Ícone, Lisp, e ML são todas as línguas que não têm sintática declarações, eles só têm expressões.Até mesmo a classe estruturada loop condicional e formas são consideradas expressões, e eles têm valores—mas não muito interessantes.

Outras dicas

Eu gostaria de fazer uma pequena correção para o Joel resposta acima.

C# não permitir que todas as expressões para ser usado como demonstrações.Em particular, só de atribuição, uma chamada de incremento e decremento expressões podem ser usados como extratos.

Por exemplo, o compilador C# irá sinalizar o código a seguir como um erro de sintaxe:

1 + 2;

  • uma expressão é qualquer coisa que produz um valor:2 + 2
  • uma instrução é uma das principais "blocos" de execução do programa.

Observe que, no C, "=" é, na verdade, um operador, que faz duas coisas:

  • retorna o valor da mão direita subexpressão.
  • copia o valor da mão direita subexpressão na variável do lado esquerdo.

Aqui está um extrato do ANSI C gramática.Você pode ver que C não tem muitos tipos diferentes de instruções...a maioria das instruções de um programa são a expressão de instruções, i.é.uma expressão com um ponto-e-vírgula no final.

statement
    : labeled_statement
    | compound_statement
    | expression_statement
    | selection_statement
    | iteration_statement
    | jump_statement
    ;

expression_statement
    : ';'
    | expression ';'
    ;

http://www.lysator.liu.se/c/ANSI-C-grammar-y.html

Uma expressão é algo que retorna um valor, considerando que a declaração não.

Exemplos:

1 + 2 * 4 * foo.bar()     //Expression
foo.voidFunc(1);          //Statement

O Grande Negócio entre os dois é que você pode cadeia de expressões, considerando que as declarações não podem ser encadeadas.

Você pode encontrar isso no taxas, mas as expressões são avaliadas para algum valor, enquanto as instruções não têm valor avaliado.

Assim, as expressões podem ser usadas em declarações, mas não a outra maneira ao redor.

Note que algumas linguagens (como Lisp, e eu acredito que Ruby, e muitos outros) não diferencia instrução vs expressão...em tais idiomas, tudo é expressão e pode ser encadeado com outras expressões.

Para obter uma explicação das diferenças importantes na composição (chainability) de expressões vs declarações, o meu favorito de referência é John Backus do prêmio Turing papel, Pode programação de ser libertados de von Neumann estilo?.

Linguagens imperativas (Fortran, C, Java, ...) enfatizar declarações para a estruturação de programas, e têm expressões como uma espécie de pós-pensamento.Linguagem funcional enfatizar expressões. Puramente funcional línguas têm tão poderosas expressões que as declarações podem ser completamente eliminados.

Simplesmente:uma expressão avaliada como um valor, uma declaração não.

As expressões podem ser avaliados, para obter um valor, considerando que as declarações não retornar um valor (eles são do tipo vazio).

Chamada de função expressões também podem ser consideradas declarações de curso, mas a menos que o ambiente de execução possui uma variável interna para guardar o valor retornado, não há nenhuma maneira de recuperá-lo.

Declaração de linguagens orientadas a exigir que todos os procedimentos de uma lista de instruções.Expressão linguagens orientadas, o que provavelmente é de todos os funcionais de idiomas, são listas de expressões, ou em tha caso de LISP, uma S-expressão que representa uma lista de expressões.

Embora ambos os tipos podem ser compostos, a maioria das expressões pode ser composto por, arbitrariamente, desde que os tipos correspondentes.Cada tipo de instrução tem a sua própria forma de composição de outras instruções, se eles podem fazer isso tudo.Foreach e se declarações exigem uma única instrução ou que todos os subordinados declarações de ir em um bloco de instrução, um após o outro, a menos que o substatements permitir suas próprias substatements.

Instruções pode também incluir expressões, onde uma expressão realmente não incluem quaisquer declarações.Uma exceção, porém, seria uma expressão lambda, que representa uma função, e, portanto, podem incluir qualquer coisa, uma função pode incluem a menos que a linguagem só permite limitada lambdas, como Python único de expressões lambdas.

Em uma expressão baseada em linguagem, tudo o que você precisa é de uma única expressão de uma função desde que todas as estruturas de controle de retorno de um valor (um monte deles retorno NIL).Não há necessidade de uma instrução de retorno desde a última expressão avaliada na função é o valor de retorno.

Algumas coisas sobre a expressão com base idiomas:


O mais importante:Tudo retorna um valor


Não há nenhuma diferença entre colchetes e chaves para delimitação de blocos de código e expressões, pois tudo é expressão.Isso não impede de escopo léxico que:Uma variável local pode ser definido para a expressão em que a sua definição está contida e todas as instruções contidas, por exemplo.


Em uma expressão de linguagem, tudo retorna um valor.Isso pode ser um pouco estranho à primeira-o Que não (FOR i = 1 TO 10 DO (print i)) retorno?

Alguns exemplos simples:

  • (1) retorna 1
  • (1 + 1) retorna 2
  • (1 == 1) retorna TRUE
  • (1 == 2) retorna FALSE
  • (IF 1 == 1 THEN 10 ELSE 5) retorna 10
  • (IF 1 == 2 THEN 10 ELSE 5) retorna 5

Um par de exemplos mais complexos:

  • Algumas coisas, como algumas chamadas de função, realmente não tem um valor significativo para retornar (Coisas que só produzem efeitos colaterais?).Chamar OpenADoor(), FlushTheToilet() ou TwiddleYourThumbs() irá retornar algum tipo de valor mundano, tais como OK, Feito, ou o Sucesso.
  • Quando vários desvinculado expressões são avaliadas dentro de um maior expressão, o valor de a última coisa avaliada na grande expressão torna-se o valor de a grande expressão.Para tomar o exemplo de (FOR i = 1 TO 10 DO (print i)), o valor do loop for é "10", ele faz com que o (print i) expressão ser avaliada de 10 vezes, cada vez que voltar eu como uma seqüência de caracteres.O tempo final através de devoluções 10, a nossa resposta final

Muitas vezes é necessário uma ligeira mudança de mentalidade para obter o máximo de uma expressão de linguagem, desde o fato de que tudo é uma expressão torna possível 'inline' um monte de coisas

Como um exemplo rápido:

 FOR i = 1 to (IF MyString == "Hello, World!" THEN 10 ELSE 5) DO
 (
    LotsOfCode
 )

é perfeitamente válida a substituição para o não baseado na expressão

IF MyString == "Hello, World!" THEN TempVar = 10 ELSE TempVar = 5 
FOR i = 1 TO TempVar DO
(    
    LotsOfCode  
)

Em alguns casos, o esquema de expressão baseado no código permite sentir-se muito mais natural para mim

Claro, isso pode levar à loucura.Como parte de um hobby em uma expressão baseada em linguagem de script chamada MaxScript, eu consegui vir para cima com este monstro linha

IF FindSectionStart "rigidifiers" != 0 THEN FOR i = 1 TO (local rigidifier_array = (FOR i = (local NodeStart = FindsectionStart "rigidifiers" + 1) TO (FindSectionEnd(NodeStart) - 1) collect full_array[i])).count DO
(
    LotsOfCode
)

Uma declaração é um caso especial de uma expressão, um com void escreva.A tendência de línguas para tratar declarações de forma diferente, muitas vezes, provoca problemas, e seria melhor se eles estivessem devidamente generalizada.

Por exemplo, em C# temos muito útil Func<T1, T2, T3, TResult> sobrecarregado conjunto de genéricos delegados.Mas também temos que ter um correspondente Action<T1, T2, T3> bem definido, e de uso geral de alto programação constantemente tem que ser duplicado para lidar com esta infeliz de bifurcação.

Exemplo Trivial - uma função que verifica se uma referência é nulo antes de chamar para outra função:

TResult IfNotNull<TValue, TResult>(TValue value, Func<TValue, TResult> func)
                  where TValue : class
{
    return (value == null) ? default(TValue) : func(value);
}

Poderia o compilador lidar com a possibilidade de TResult sendo void?Sim.Tudo o que tem a fazer é exigir que o retorno é seguido por uma expressão que é do tipo void.O resultado de default(void) seria do tipo void, e a func está sendo transmitido precisa ser do formulário Func<TValue, void> (o que seria equivalente a Action<TValue>).

Uma série de outras respostas implica que você não pode cadeia de afirmações como você pode com expressões, mas não tenho certeza de onde essa idéia vem.Podemos pensar o ; que aparece depois de declarações como um binário infixo operador, tendo duas expressões do tipo void e combiná-los em uma única expressão do tipo void.

Instruções -> Instruções para seguir sequencialmente
Expressões -> Avaliação que retorna um valor

Instruções são basicamente como os passos ou instruções de um algoritmo, o resultado da execução de uma instrução é a realização do ponteiro de instrução (assim chamado em assembler)

Expressões não implica e ordem de execução à primeira vista, a sua finalidade é avaliar e retornar um valor.No imperativo linguagens de programação a avaliação de uma expressão tem um fim, mas é apenas por causa do imperativo modelo, mas não é a sua essência.

Exemplos de Declarações:

for
goto
return
if

(todos eles implicam o avanço de linha (declaração) de execução para outra linha)

Exemplo de expressões:

2+2

(isso não implica a idéia de execução, mas de avaliação)

Instruções são gramaticalmente frases completas.As expressões não são.Por exemplo

x = 5

lê-se como "x recebe 5." Esta é uma frase completa.O código

(x + 5)/9.0

lê-se, "x mais 5 tudo dividido pelo 9.0." Esta não é uma frase completa.A declaração de

while k < 10: 
    print k
    k += 1

é uma frase completa.Observe que o ciclo de cabeçalho não é;"enquanto k < 10," é um subordinando cláusula.

Declaração,

Uma declaração é um procedimento de blocos de construção a partir da qual todos os programas C# são construídos.Uma declaração pode declarar uma variável local ou constante, chamada de um método, crie um objeto, ou atribuir um valor a uma variável, de propriedade, ou de campo.

Uma série de instruções rodeado por chavetas formar um bloco de código.Um corpo de método é um exemplo de um bloco de código.

bool IsPositive(int number)
{
    if (number > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Instruções em C#, muitas vezes, contêm expressões.Uma expressão em C# é um fragmento de código que contém um valor literal, um simples nome, ou um operador e seus operandos.

Expressão,

Uma expressão é um fragmento de código que pode ser avaliada como um único valor, objeto, método, ou espaço de nomes.Os dois tipos mais simples de expressões literais e nomes simples.Um literal é um valor constante que não tem nome.

int i = 5;
string s = "Hello World";

Tanto o i e s são nomes simples identificação de variáveis locais.Quando essas variáveis são usados em uma expressão, o valor da variável é recuperado e utilizado para a expressão.

Eu prefiro o significado de statement na lógica formal, o sentido da palavra.Ele é aquele que altera o estado de uma ou mais das variáveis no cálculo, permitindo uma verdadeira ou falsa declaração a ser feita sobre o seu valor(es).

Eu acho que sempre haverá confusão no mundo da computação e a ciência em geral, quando uma nova terminologia ou palavras são introduzidas, palavras existentes são "adaptados" ou usuários são ignorantes do existente, estabelecida ou 'adequado' a terminologia para o que eles estão descrevendo

Eu não estou realmente satisfeito com as respostas aqui.Eu olhei para a gramática para C++ (ISO, 2008).No entanto, talvez por uma questão de didática e programação de respostas pode ser suficiente para distinguir os dois elementos (a realidade parece mais complicado embora).

Uma declaração consiste de zero ou mais expressões, mas também pode ser de outros conceitos de linguagem.Este é o Extended Backus Naur form para a gramática (trecho de instrução):

statement:
        labeled-statement
        expression-statement <-- can be zero or more expressions
        compound-statement
        selection-statement
        iteration-statement
        jump-statement
        declaration-statement
        try-block

Podemos ver os outros conceitos que são considerados as declarações em C++.

  • expressão-declaração des é auto-explicativo (uma instrução pode conter zero ou mais expressões, leia a gramática com cuidado, é complicado)
  • case por exemplo, é uma rotulado-declaração de
  • seleção-declaração des são if if/else, case
  • iteração-declaração des são while, do...while, for (...)
  • salto-declaração des são break, continue, return (pode expressão de retorno), goto
  • declaração-declaração de é o conjunto de declarações
  • tente-bloco é de instrução que representa try/catch blocos
  • e pode ser que haja mais para baixo a gramática

Este é um trecho mostrando as expressões parte:

expression:
        assignment-expression
        expression "," assignment-expression
assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator initializer-clause
        throw-expression
  • expressões são, ou contêm, muitas vezes, as atribuições de
  • condicional-expressão (sons enganosa) refere-se ao uso dos operadores (+, -, *, /, &, |, &&, ||, ...)
  • jogue-expressão - uh?o throw cláusula é uma expressão muito

Aqui está o resumo de um dos mais simples resposta que eu encontrei.

originalmente Respondeu por Anders Kaseorg

Uma instrução é uma completa linha de código que executa alguma ação, enquanto uma expressão é qualquer seção do código que avalia para um valor.

Expressões podem ser combinadas "horizontal" para maiores expressões usando os operadores, enquanto que as declarações só podem ser combinadas "verticalmente" escrevendo um após o outro, ou com o bloco de construções.

Cada expressão pode ser usada como uma declaração (cujo efeito é o de avaliar a expressão e ignorar o valor resultante), mas a maioria das afirmações não podem ser utilizados como expressões.

http://www.quora.com/Python-programming-language-1/Whats-the-difference-between-a-statement-and-an-expression-in-Python

Para melhorar e validar a minha anterior resposta, a definição de uma linguagem de programação termos deve ser explicado a partir de informática tipo de teoria, quando aplicável.

Uma expressão tem um tipo diferente do tipo de Fundo, i.é.ele tem um valor.Declaração da Unidade ou do tipo de Fundo.

Daqui se segue que uma instrução só pode ter qualquer efeito em um programa quando ele cria um efeito colateral, porque ela não pode retornar um valor ou retorna apenas o valor do tipo de Unidade que é nonassignable (em algumas linguagens como C do void) ou (como no Scala) podem ser armazenados para uma atrasada de avaliação da instrução.

Obviamente, um @pragma ou um /*comment*/ ter nenhum tipo e, portanto, são diferenciadas das demonstrações contábeis.Assim, o único tipo de declaração que não têm efeitos colaterais seria um não-funcionamento.Não-operação só é útil como marcador de posição para futuros efeitos colaterais.Qualquer outra ação devido a uma declaração poderia ser um efeito colateral.Novamente um compilador dica, e.g. @pragma, não é uma declaração, porque ele não tem nenhum tipo.

Mais precisamente, uma declaração deve ter um "efeito colateral" (i.é. imperativo) e uma expressão deve tem um valor tipo (i.e.não o tipo de fundo).

O tipo de instrução é o tipo de unidade, mas devido a Travar, o teorema de unidade é uma ficção, então vamos dizer o tipo de fundo.


Void não é precisamente o tipo de fundo (não é o subtipo de todos os tipos possíveis).Ele existe em idiomas que não tem um completamente o tipo de som do sistema.Isso pode soar como um esnobe instrução, mas integralidade como a variância anotações são fundamentais para a escrita de software extensível.

Vamos ver o que a Wikipédia tem a dizer sobre este assunto.

https://en.wikipedia.org/wiki/Statement_(computer_science)

Em programação de computadores, uma instrução é o menor elemento autônomo de um imperativo linguagem de programação que expressa alguns ação para ser realizado.

Muitas linguagens (por exemplo,C) fazer-se uma distinção entre as afirmações e definições, com uma declaração contendo apenas o código executável e uma definição de declarar um identificador, enquanto uma expressão avaliada como um valor apenas.

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