Pregunta

Lo pregunto con respecto a C#, pero supongo que es lo mismo en la mayoría de los demás idiomas.

¿Alguien tiene una buena definición de expresiones y declaraciones y cuales son las diferencias?

¿Fue útil?

Solución

Expresión: Algo que se evalúa como un valor.Ejemplo: 1+2/x
Declaración: Una línea de código que hace algo.Ejemplo: IR A 100

En los primeros lenguajes de programación de propósito general, como FORTRAN, la distinción era muy clara.En FORTRAN, una declaración era una unidad de ejecución, algo que usted hacía.La única razón por la que no se le llamó "línea" fue porque a veces abarcaba varias líneas.Una expresión por sí sola no podría hacer nada...había que asignarlo a una variable.

1 + 2 / X

es un error en FORTRAN, porque no hace nada.Había que hacer algo con esa expresión:

X = 1 + 2 / X

FORTRAN no tenía una gramática como la conocemos hoy; esa idea se inventó, junto con la forma Backus-Naur (BNF), como parte de la definición de Algol-60.En ese momento el semántico La distinción ("tener un valor" versus "hacer algo") fue consagrada en sintaxis:un tipo de frase era una expresión y otro era una declaración, y el analizador podía distinguirlas.

Los diseñadores de lenguajes posteriores desdibujaron la distinción:permitieron expresiones sintácticas para hacer cosas y permitieron declaraciones sintácticas que tenían valores.El primer ejemplo de lenguaje popular que aún sobrevive es C.Los diseñadores de C se dieron cuenta de que no había ningún daño si se permitía evaluar una expresión y descartar el resultado.En C, cada expresión sintáctica se puede convertir en una declaración simplemente agregando un punto y coma al final:

1 + 2 / x;

Es una declaración totalmente legítima aunque no pasará absolutamente nada.De manera similar, en C, una expresión puede tener efectos secundarios—Puede cambiar algo.

1 + 2 / callfunc(12);

porque callfunc podría hacer algo útil.

Una vez que permita que cualquier expresión sea una declaración, también puede permitir el operador de asignación (=) dentro de las expresiones.Es por eso que C te permite hacer cosas como

callfunc(x = 2);

Esto evalúa la expresión x = 2 (asignando el valor de 2 a x) y luego pasa ese (el 2) a la función callfunc.

Esta confusión de expresiones y declaraciones ocurre en todos los derivados de C (C, C++, C# y Java), que todavía tienen algunas declaraciones (como while) pero que permiten usar casi cualquier expresión como declaración (en C# solo se pueden usar como declaraciones expresiones de asignación, llamada, incremento y decremento;ver La respuesta de Scott Wisniewski).

Tener dos "categorías sintácticas" (que es el nombre técnico del tipo de declaraciones y expresiones) puede llevar a la duplicación de esfuerzos.Por ejemplo, C tiene dos formas de condicional, la forma de declaración

if (E) S1; else S2;

y la forma de expresión

E ? E1 : E2

Y a veces la gente desear duplicación que no está ahí:En el estándar C, por ejemplo, solo una declaración puede declarar una nueva variable local, pero esta capacidad es lo suficientemente útil como para que el compilador GNU C proporcione una extensión de GNU que permite que una expresión también declare una variable local.

A los diseñadores de otros lenguajes no les gustó este tipo de duplicación y vieron desde el principio que si las expresiones pueden tener efectos secundarios además de valores, entonces el sintáctico La distinción entre enunciados y expresiones no es tan útil, por lo que se deshicieron de ella.Haskell, Icon, Lisp y ML son lenguajes que no tienen declaraciones sintácticas: solo tienen expresiones.Incluso los bucles estructurados de clases y las formas condicionales se consideran expresiones y tienen valores, pero no muy interesantes.

Otros consejos

Me gustaría hacer una pequeña corrección a la respuesta anterior de Joel.

C# no permite que todas las expresiones se utilicen como declaraciones.En particular, sólo se pueden utilizar como declaraciones expresiones de asignación, llamada, incremento y decremento.

Por ejemplo, el compilador de C# marcará el siguiente código como un error de sintaxis:

1 + 2;

  • una expresión es cualquier cosa que produzca un valor:2 + 2
  • una declaración es uno de los "bloques" básicos de la ejecución del programa.

Tenga en cuenta que en C, "=" es en realidad un operador, que hace dos cosas:

  • devuelve el valor de la subexpresión de la derecha.
  • copia el valor de la subexpresión de la derecha en la variable del lado izquierdo.

Aquí hay un extracto de la gramática ANSI C.Puedes ver que C no tiene muchos tipos diferentes de declaraciones...la mayoría de las declaraciones en un programa son declaraciones de expresión, es deciruna expresión con un punto y coma al 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

Una expresión es algo que devuelve un valor, mientras que una declaración no.

Por ejemplo:

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

El gran problema entre los dos es que puedes encadenar expresiones, mientras que las declaraciones no se pueden encadenar.

Puedes encontrar esto en Wikipedia, pero las expresiones se evalúan con algún valor, mientras que las declaraciones no tienen ningún valor evaluado.

Por tanto, las expresiones se pueden utilizar en declaraciones, pero no al revés.

Tenga en cuenta que algunos lenguajes (como Lisp, y creo que Ruby, y muchos otros) no diferencian declaración versus expresión...en tales lenguajes, todo es una expresión y puede encadenarse con otras expresiones.

Para obtener una explicación de las diferencias importantes en la componibilidad (encadenabilidad) de expresiones versus declaraciones, mi referencia favorita es el artículo del premio Turing de John Backus, ¿Se puede liberar la programación del estilo von Neumann?.

Los lenguajes imperativos (Fortran, C, Java, ...) enfatizan declaraciones para estructurar programas y tienen expresiones como una especie de idea de último momento.Los lenguajes funcionales enfatizan las expresiones. Puramente Los lenguajes funcionales tienen expresiones tan poderosas que las declaraciones pueden eliminarse por completo.

Simplemente:una expresión se evalúa como un valor, una declaración no.

Las expresiones se pueden evaluar para obtener un valor, mientras que las declaraciones no devuelven un valor (son del tipo vacío).

Las expresiones de llamada a funciones también pueden considerarse declaraciones, por supuesto, pero a menos que el entorno de ejecución tenga una variable incorporada especial para contener el valor devuelto, no hay forma de recuperarlo.

Los lenguajes orientados a declaraciones requieren que todos los procedimientos sean una lista de declaraciones.Los lenguajes orientados a expresiones, que probablemente sean todos lenguajes funcionales, son listas de expresiones o, en el caso de LISP, una expresión S larga que representa una lista de expresiones.

Aunque ambos tipos se pueden componer, la mayoría de las expresiones se pueden componer arbitrariamente siempre que los tipos coincidan.Cada tipo de declaración tiene su propia manera de componer otras declaraciones, si es que todas pueden hacerlo.Las declaraciones Foreach y if requieren una sola declaración o que todas las declaraciones subordinadas vayan en un bloque de declaraciones, una tras otra, a menos que las subdeclaraciones permitan sus propias subdeclaraciones.

Las declaraciones también pueden incluir expresiones, donde una expresión en realidad no incluye ninguna declaración.Sin embargo, una excepción sería una expresión lambda, que representa una función y, por lo tanto, puede incluir cualquier cosa que una función pueda incluir a menos que el lenguaje solo permita lambdas limitadas, como las lambdas de expresión única de Python.

En un lenguaje basado en expresiones, todo lo que necesita es una única expresión para una función, ya que todas las estructuras de control devuelven un valor (muchas de ellas devuelven NIL).No es necesaria una declaración de retorno ya que la última expresión evaluada en la función es el valor de retorno.

Algunas cosas sobre los lenguajes basados ​​en expresiones:


Lo más importante:Todo devuelve un valor


No hay diferencia entre llaves y llaves para delimitar bloques de código y expresiones, ya que todo es una expresión.Sin embargo, esto no impide el alcance léxico:Se podría definir una variable local para la expresión en la que está contenida su definición y todas las declaraciones contenidas en ella, por ejemplo.


En un lenguaje basado en expresiones, todo devuelve un valor.Esto puede resultar un poco extraño al principio. ¿Qué significa (FOR i = 1 TO 10 DO (print i)) ¿devolver?

Algunos ejemplos simples:

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

Un par de ejemplos más complejos:

  • Algunas cosas, como algunas llamadas a funciones, realmente no tienen un valor significativo que devolver (¿Cosas que solo producen efectos secundarios?).Vocación OpenADoor(), FlushTheToilet() o TwiddleYourThumbs() devolverá algún tipo de valor mundano, como OK, Listo o Éxito.
  • Cuando se evalúan varias expresiones no vinculadas dentro de una expresión más grande, el valor de la última cosa evaluada en la expresión grande se convierte en el valor de la expresión grande.Para tomar el ejemplo de (FOR i = 1 TO 10 DO (print i)), el valor del bucle for es "10", provoca que el (print i) expresión que se evaluará 10 veces, devolviendo cada vez i como una cadena.El último tiempo a través de regresos. 10, nuestra respuesta final

A menudo se requiere un ligero cambio de mentalidad para aprovechar al máximo un lenguaje basado en expresiones, ya que el hecho de que todo sea una expresión hace posible "alinear" muchas cosas.

Como ejemplo rápido:

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

es un reemplazo perfectamente válido para el no basado en expresiones

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

En algunos casos, el diseño que permite el código basado en expresiones me parece mucho más natural.

Por supuesto, esto puede llevar a la locura.Como parte de un proyecto de hobby en un lenguaje de programación basado en expresiones llamado MaxScript, logré crear esta línea monstruosa.

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
)

Una declaración es un caso especial de una expresión, una con void tipo.La tendencia de los lenguajes a tratar los enunciados de manera diferente a menudo causa problemas, y sería mejor si se generalizaran adecuadamente.

Por ejemplo, en C# tenemos la muy útil Func<T1, T2, T3, TResult> conjunto sobrecargado de delegados genéricos.Pero también tenemos que tener una correspondiente Action<T1, T2, T3> Establece también, y la programación de orden superior de propósito general tiene que duplicarse constantemente para hacer frente a esta desafortunada bifurcación.

Ejemplo trivial: una función que comprueba si una referencia es nula antes de llamar a otra función:

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

¿Podría el compilador abordar la posibilidad de TResult ser void?Sí.Todo lo que tiene que hacer es exigir que return vaya seguido de una expresión que sea del tipo void.El resultado de default(void) seria de tipo void, y la función que se pasa debería tener la forma Func<TValue, void> (lo que equivaldría a Action<TValue>).

Varias otras respuestas implican que no se pueden encadenar declaraciones como se puede hacer con expresiones, pero no estoy seguro de dónde viene esta idea.Podemos pensar en el ; que aparece después de las declaraciones como un operador infijo binario, tomando dos expresiones de tipo void y combinándolos en una sola expresión de tipo void.

Declaraciones -> Instrucciones a seguir secuencialmente
Expresiones -> Evaluación que devuelve un valor

Las declaraciones son básicamente como pasos o instrucciones en un algoritmo, el resultado de la ejecución de una declaración es la actualización del puntero de instrucción (así llamado en ensamblador)

Las expresiones no implican un orden de ejecución a primera vista, su propósito es evaluar y devolver un valor.En los lenguajes de programación imperativos la evaluación de una expresión tiene un orden, pero es solo por el modelo imperativo, pero no es su esencia.

Ejemplos de declaraciones:

for
goto
return
if

(todos ellos implican el avance de la línea (declaración) de ejecución a otra línea)

Ejemplo de expresiones:

2+2

(no implica la idea de ejecución, sino de evaluación)

Las declaraciones son oraciones gramaticalmente completas.Las expresiones no lo son.Por ejemplo

x = 5

lee como "x obtiene 5." Esta es una oración completa.El código

(x + 5)/9.0

lee, "X más 5, todos divididos por 9.0". Esta no es una oración completa.La declaración

while k < 10: 
    print k
    k += 1

es una oración completa.Observe que el encabezado del bucle no lo es;"mientras k < 10" es una cláusula subordinada.

Declaración,

Una declaración es un bloque de procedimiento a partir del cual se construyen todos los programas de C#.Una declaración puede declarar una variable o constante local, llamar a un método, crear un objeto o asignar un valor a una variable, propiedad o campo.

Una serie de declaraciones rodeadas por llaves forman un bloque de código.El cuerpo de un método es un ejemplo de un bloque de código.

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

Las declaraciones en C# suelen contener expresiones.Una expresión en C# es un fragmento de código que contiene un valor literal, un nombre simple o un operador y sus operandos.

Expresión,

Una expresión es un fragmento de código que se puede evaluar en un único valor, objeto, método o espacio de nombres.Los dos tipos de expresiones más simples son los literales y los nombres simples.Un literal es un valor constante que no tiene nombre.

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

Tanto i como s son nombres simples que identifican variables locales.Cuando esas variables se usan en una expresión, el valor de la variable se recupera y se usa para la expresión.

prefiero el significado de statement en el sentido lógico formal de la palabra.Es aquel que cambia el estado de una o más de las variables en el cálculo, permitiendo hacer una afirmación verdadera o falsa sobre su(s) valor(es).

Supongo que siempre habrá confusión en el mundo de la informática y en la ciencia en general cuando se introducen nuevas terminologías o palabras, se "reutilizan" palabras existentes o los usuarios ignoran la terminología existente, establecida o "adecuada" para lo que están describiendo.

No estoy realmente satisfecho con ninguna de las respuestas aquí.Miré la gramática para C++ (ISO 2008).Sin embargo, tal vez por razones didácticas y de programación, las respuestas sean suficientes para distinguir los dos elementos (aunque la realidad parece más complicada).

Una declaración consta de cero o más expresiones, pero también pueden contener otros conceptos lingüísticos.Esta es la forma extendida de Backus Naur para la gramática (extracto de la declaración):

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 los otros conceptos que se consideran declaraciones en C++.

  • declaración de expresións se explica por sí mismo (una declaración puede consistir en cero o más expresiones, lee atentamente la gramática, es complicado)
  • case por ejemplo es un declaración etiquetada
  • declaración de selecciónsomos if if/else, case
  • declaración de iteraciónsomos while, do...while, for (...)
  • declaración de saltosomos break, continue, return (puede devolver expresión), goto
  • Declaración es el conjunto de declaraciones
  • bloque de prueba es una declaración que representa try/catch bloques
  • y puede que haya algo más en la gramática

Este es un extracto que muestra la parte de las expresiones:

expression:
        assignment-expression
        expression "," assignment-expression
assignment-expression:
        conditional-expression
        logical-or-expression assignment-operator initializer-clause
        throw-expression
  • las expresiones son o contienen a menudo asignaciones
  • expresión condicional (suena engañoso) se refiere al uso de los operadores (+, -, *, /, &, |, &&, ||, ...)
  • expresión de lanzamiento - ¿oh?el throw La cláusula también es una expresión.

Aquí está el resumen de una de las respuestas más simples que encontré.

Respondido originalmente por Anders Kaseorg

Una declaración es una línea completa de código que realiza alguna acción, mientras que una expresión es cualquier sección del código que se evalúa como un valor.

Las expresiones se pueden combinar "horizontalmente" en expresiones más grandes utilizando operadores, mientras que las declaraciones sólo se pueden combinar "verticalmente" escribiendo una tras otra o con construcciones de bloques.

Cada expresión se puede usar como una declaración (cuyo efecto es evaluar la expresión e ignorar el valor resultante), pero la mayoría de las declaraciones no se pueden usar como expresiones.

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

Para mejorar y validar mi respuesta anterior, las definiciones de los términos del lenguaje de programación deben explicarse a partir de la teoría de tipos de informática cuando corresponda.

Una expresión tiene un tipo distinto al tipo Bottom, es decirtiene un valor.Una declaración tiene el tipo Unidad o Fondo.

De esto se deduce que una declaración sólo puede tener algún efecto en un programa cuando crea un efecto secundario, porque o no puede devolver un valor o sólo devuelve el valor del tipo Unidad que no es asignable (en algunos lenguajes como una C void) o (como en Scala) se pueden almacenar para una evaluación retrasada de la declaración.

obviamente un @pragma o un /*comment*/ no tienen tipo y por lo tanto se diferencian de las declaraciones.Por lo tanto, el único tipo de declaración que no tendría efectos secundarios sería una no operación.La no operación sólo es útil como marcador de posición para futuros efectos secundarios.Cualquier otra acción debida a una declaración sería un efecto colateral.Nuevamente una sugerencia del compilador, p. @pragma, no es una declaración porque no tiene tipo.

Más precisamente, una declaración debe tener una "efecto secundario" (es decir. ser imperativo) y una expresión debe tener a valor tipo (es decirno el tipo inferior).

El tipo de declaración es el tipo de unidad, pero debido al teorema de detención la unidad es ficción, así que digamos que tipo inferior.


Void no es precisamente el tipo inferior (no es el subtipo de todos los tipos posibles).Existe en idiomas que no tengo un sistema de tipo completamente sólido.Puede parecer una afirmación esnob, pero la integridad como anotaciones de varianza son fundamentales para escribir software extensible.

Veamos qué tiene que decir Wikipedia al respecto.

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

En programación de computadoras, una declaración es el elemento independiente más pequeño de un imperativo lenguaje de programación que expresa Algo de acción para ser llevado a cabo.

Muchos idiomas (p. ej.C) hacer una distinción entre declaraciones y definiciones, con una declaración que solo contiene código ejecutable y una definición que declara un identificador, mientras que una expresión se evalúa solo como un valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top