Expresión Frente A La Declaración De

Estoy pidiendo con respecto a c#, pero supongo que es el mismo en la mayoría de los otros idiomas.

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

  • Me parece que la respuesta que usted eligió para ser ambiguo. Expresión que también hace algo– se evalúa a un valor. Yo siempre que no sea ambigua respuesta.
  • No ambigua y también mal. El aceptó la respuesta está redactado de una manera informal, pero que en el texto hace que sea fácil de comprender, y lo que es más importante, el significado que transmite es exacta.
InformationsquelleAutor | 2008-08-21

18 Kommentare

  1. 510

    Expresión: Algo que evalúa a un valor. Ejemplo: 1+2/x

    Declaración: Una línea de código que hace algo. Ejemplo: GOTO 100

    En los primeros propósito general de los lenguajes de programación como FORTRAN, la distinción era cristalina. En FORTRAN, una declaración que fue una unidad de ejecución, cosa que hizo. La única razón por la que no se llamaba una «línea», fue porque a veces ocupa varias líneas. Una expresión en su propio no podía hacer nada… tuvo que asignar a una variable.

    1 + 2 / X

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

    X = 1 + 2 / X

    FORTRAN no tiene una gramática como la conocemos hoy en día—la idea fue inventado, junto con la Forma de Backus-Naur (BNF), como parte de la definición de Algol-60. En ese punto de la semántica distinción («tener un valor» frente a «hacer algo») fue consagrado en sintaxis: un tipo de frase era una expresión, y la otra era una declaración, y el parser podían distinguirlos.

    Diseñadores de idiomas más tarde borrosa la distinción: la que permite sintáctica de las expresiones de hacer las cosas, y que permite sintáctica de declaraciones que tuvieron valores.
    Los primeros lenguaje popular ejemplo de que todavía sobrevive es C. Los diseñadores de C di cuenta de que no hay daño estaba hecho si se permitiera evaluar una expresión y bote el resultado. En C, cada expresión sintáctica puede ser un hecho en una declaración que acaba atacado por un punto y coma a lo largo de la final:

    1 + 2 / x;

    es totalmente de fiar declaración, incluso a pesar de que absolutamente nada de lo que va a suceder. Del mismo modo, en C, una expresión puede tener efectos secundarios—se puede cambiar algo.

    1 + 2 / callfunc(12);

    porque callfunc sólo podría hacer algo útil.

    Una vez que se permite a cualquier expresión de ser una declaración, podría permitir que el operador de asignación (=) dentro de las expresiones. Por eso C le permite hacer cosas como

    callfunc(x = 2);

    Este evalúa la expresión x = 2 (asigna el valor 2 a x) y, a continuación, pasa que (la 2) a la función callfunc.

    Esta difuminación de las expresiones y declaraciones que se produce en todos los C-derivados (C, C++, C# y Java), que todavía tiene algunas de las declaraciones (como while), pero que permiten que casi cualquier expresión que se utiliza como una declaración (en C# sólo de asignación, la llamada, el incremento y decremento de las expresiones puede ser utilizado como declaraciones; ver Scott Wisniewski la respuesta).

    Tener dos «categorías sintácticas» (que es el nombre técnico para el tipo de cosa, afirmaciones y expresiones que son) puede conducir a la duplicación de esfuerzos. Por ejemplo, C tiene dos formas de condicional, el formulario de declaración

    if (E) S1; else S2;

    y la expresión de la forma

    E ? E1 : E2

    Y a veces la gente quiere la duplicación de que no está ahí: en el estándar de C, por ejemplo, sólo una declaración puede declarar una nueva variable local—pero esta capacidad es útil suficiente para que el
    Compilador de C de GNU proporciona una extensión de GNU que permite una expresión para declarar una variable local así.

    Los diseñadores de otros idiomas no les gusta este tipo de duplicación, y se vio desde el principio que si las expresiones pueden tener efectos secundarios así como los valores, los sintáctica distinción entre afirmaciones y expresiones que no es del todo útil—así que se deshicieron de ella. Haskell, Icono, Lisp, y ML son todas las lenguas que no tienen sintáctica declaraciones—que sólo tienen expresiones. Incluso la clase estructurada de bucle y las formas condicionales son considerados expresiones, y tienen valores—pero no muy interesantes.

    • Si no estoy mal interpretando aquí, usted se parece a afirmar que «(setf (tercera foo) ‘oca)» es una expresión, no una declaración, tanto porque es de Lisp, que «no tiene declaraciones», y porque Lisp es de más de una década mayor que C, que fue la «primera lengua popular para desdibujar las líneas entre las expresiones y declaraciones].» Podría explicar los detalles de la que a mí?
    • Sampson, le han pedido que como una cuestión separada?
    • Si no me equivoco, callfunc(x = 2); pasa x a callfunc, no 2. Si x es un float, callfunc(float) será llamado, no callfunc(int). Y en C++, si pasa x=y a func, y func toma una referencia y lo cambia, cambia x, no y.
    • En la respuesta anterior, está escrito que «Haskell,… son todas las lenguas que no tienen sintáctica declaraciones – que sólo tienen expresiones». Tengo curiosidad por qué where cláusula en haskell se considera una expresión y no una declaración. learnyouahaskell.com/syntax-in-functions#where
  2. 53

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

    C# no permite que todas las expresiones para ser utilizado como declaraciones. En particular, sólo la asignación, la llamada, el incremento y decremento de las expresiones puede ser utilizado como declaraciones.

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

    1 + 2;

  3. 21
    • una expresión es cualquier cosa que se obtiene un valor de: 2 + 2
    • una declaración es uno de los «bloques» 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 mano derecha subexpresión.
    • copia el valor de la mano derecha subexpresión en la variable en el lado izquierdo.

    Aquí un extracto de la norma ANSI C de la gramática. Se puede ver que C no tiene muchos tipos diferentes de declaraciones… la mayoría de las declaraciones en un programa son la expresión de las declaraciones, es decir, una 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

    • Lógica incorrecta sobre lo que es una afirmación. Declarativo programa también puede ejecutar, pero declarativo programa no tiene instrucciones. Una declaración que es y hace la «efectos secundarios», es decir, es imprescindible. cf. mi respuesta.
  4. 14

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

    Por ejemplos:

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

    La Gran Acuerdo entre los dos es que la cadena de expresiones juntos, mientras que las declaraciones no pueden ser encadenados.

    • Seguro declaraciones pueden ser encadenados. {stmt1; stmt2; stmt3;} es una cadena, y es también un (compuesto) declaración en sí.
    • foo.voidFunc(1); es una expresión con un vacío de valor. while y if son declaraciones.
    • Tengo curiosidad acerca de la no-encadenamiento de los enunciados. Sería algo así como «si (x > 1) return;» a ser considerado como el encadenamiento de dos declaraciones juntos?
    • Creo que el return se considera un substatement.
  5. 8

    Usted puede encontrar esto en wikipedia, pero las expresiones se evalúan a cierto valor, mientras que las declaraciones no tienen valor evaluado.

    Por lo tanto, se pueden utilizar expresiones en las declaraciones, pero no la otra manera alrededor.

    Tenga en cuenta que algunos idiomas (como Lisp, y creo que Ruby, y muchos otros) no diferenciar la instrucción vs expresión… en esos idiomas, todo es una expresión y pueden encadenarse con otras expresiones.

  6. 8

    Para una explicación de las diferencias importantes en la composability (chainability) de las expresiones vs declaraciones, mi favorito de la referencia a John Backus del premio Turing de papel, Puede la programación de ser liberada de la von Neumann estilo?.

    Lenguajes imperativos (Fortran, C, Java, …) hacen hincapié en declaraciones para la estructuración de los programas, y tienen expresiones como una especie de post-pensamiento. Los lenguajes funcionales hincapié en las expresiones. Puramente de los lenguajes funcionales tienen tan poderosas expresiones de declaraciones pueden ser eliminadas por completo.

  7. 5

    Simplemente: una expresión que se evalúa como un valor, un estado de cuenta no.

    • Entonces, ¿qué hace una declaración que hacer? Nada?
    • Se puede hacer algo, pero no evaluar a nada. Es decir, que no se puede asignar el resultado a una variable, mientras que usted puede con una expresión.
    • Y, por tanto, una declaración debe tener efectos secundarios, como mi pesadamente hacia abajo votado respuesta de los estados. ¿Qué otra utilidad podría ser una declaración de posiblemente tener? Incluso si un NO-OP fue considerado para ser una declaración (es sólo «declaración» en la gramática, pero no en la semántica de la capa porque se borra después del análisis y la semántica es lo que estamos discutiendo aquí), no explicar qué diablos de la utilidad general de la declaración es.
    • Las declaraciones no necesita hacer nada o tienen efectos secundarios. por ejemplo, {} es una declaración. Poner la palabra en asustar a la cita no cambiar eso. Las declaraciones son construcciones sintácticas con la semántica. No hay tal cosa como «la semántica de la capa» — usted parece estar refiriéndose a la ejecución de. Usted dice que usted está tratando de ser exacta, pero se ha fallado en eso. Su queja acerca de «la ignorancia de los votantes» es puro ad hominem; usted no tiene ninguna información acerca de los estados mentales de los downvoters.
    • Sí, todo el mundo es malo, excepto el intelectualmente deshonesto. {} se define como una declaración en el lenguaje C# spec.
  8. 5

    Expresiones pueden ser evaluados para obtener un valor, mientras que las declaraciones no devuelven un valor (que son de tipo vacío).

    Llamada a la función de las expresiones también pueden ser considerados declaraciones de curso, pero a menos que el entorno de ejecución tiene un especial incorporado en la variable para almacenar el valor devuelto, no hay manera de recuperarlo.

    Declaración de los lenguajes orientados a requerir que todos los procedimientos a ser una lista de afirmaciones. La expresión de los lenguajes orientados, que es, probablemente, todos los lenguajes funcionales, son listas de expresiones, o en el caso de LISP, un largo S-expresión que representa una lista de expresiones.

    A pesar de que ambos tipos pueden ser compuestos, la mayoría de las expresiones puede estar compuesta de forma arbitraria como siempre que los tipos coinciden. Cada tipo de instrucción tiene su propia manera de componer otras declaraciones, si ellos pueden hacerlo todo. Foreach y si las declaraciones requieren una sola declaración o que todos los subordinados declaraciones ir en un bloque de instrucciones, uno después de otro, a menos que el substatements permitir su propia substatements.

    Declaraciones también pueden incluir expresiones, donde una expresión realmente no incluyen ningún tipo de declaraciones. Una excepción, sin embargo, sería una expresión lambda, que representa una función, y por lo tanto puede incluir cualquier cosa, una función pueden icluir a menos que el lenguaje sólo permite limitar los lambdas, como el de Python sola expresión de lambdas.

    En una expresión basada en el lenguaje, todo lo que necesita es una sola expresión para una función ya que todas las estructuras de control de devolver un valor (muchos de ellos devuelve NIL). No hay necesidad de una instrucción return desde la última expresión evaluada en la función es el valor de retorno.

    • El tipo de sentencia, en la parte inferior de tipo. Void no es el fondo tipo. Consulte mi respuesta.
    • No es la null tipo de de la parte inferior de tipo (valor único de null)? No void ser más como el tipo de unidad (pero con su único valor inaccesible)?
    • Si void es el tipo de retorno de una función que nunca devuelve (por ejemplo, una función que throws un error), es el fondo tipo. De lo contrario, void es el tipo de unidad. Usted está en lo correcto que una declaración de que no puede divergir, tiene el tipo de unidad. Pero una declaración que puede divergir es la parte inferior de tipo. Debido a la Paralización de Teorema, normalmente no puede probar que una función no divergen, por lo que creo que la unidad es la ficción. El fondo tipo no puede tener un valor, por lo que no puede tener un solo valor de null.
    • Con respecto a lo que dijo hace tres años, no sé si todavía pienso en declaraciones como la de tener un vacío tipo o cualquier tipo de realidad. En la declaración de idiomas con el que estoy familiarizado, sólo valores y cualquier cosa que cualquiera de las tiendas o devuelve un valor (por ejemplo, expresiones, variables, miembros y funciones) pueden tener tipos. Yo en general creo que de la parte inferior de tipo como el conjunto vacío (sin valores) y de manera que cualquier cosa que no existe ontológicamente tendría este tipo. Un null valor es realmente un pseudovalue denota que una referencia se refiere a algo que no existe.
    • Mark me gustó la racionalidad de su respuesta. Básicamente, tomó las palabras de mi boca Y yo la esperanza estaba claro que lo tengo que admitir que tenía razón para levantar la unidad de punto. Creo que estamos de acuerdo. No me voy a molestar a mencionar esto, pero parece que algunas personas aquí creo que estoy siendo negativo. Solo estoy tratando de ser objetiva.
  9. 3

    Algunas cosas acerca de la expresión de la base idiomas:


    Más importante: Todo lo que devuelve un valor


    No hay ninguna diferencia entre corchetes y llaves para delimitar los bloques de código y expresiones, ya que todo es una expresión. Esto no impide léxico de alcance, sin embargo: Una variable local podría definirse por la expresión, en la que su definición está contenida y todas las declaraciones contenidas dentro de eso, por ejemplo.


    En una expresión basada en el lenguaje, todo lo que devuelve un valor. Esto puede ser un poco extraño al principio — ¿Qué (FOR i = 1 TO 10 DO (print i)) retorno?

    Algunos ejemplos sencillos:

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

    Un par de ejemplos más complejos:

    • Algunas cosas, como algunas llamadas de función, realmente no tienen un valor significativo para volver (Cosas que sólo producen efectos secundarios?). Llamar OpenADoor(), FlushTheToilet() o TwiddleYourThumbs() volverá algún tipo de valor mundano, tales como OK, Hecho, o el Éxito.
    • Cuando varios desvinculado de las expresiones se evalúan de dentro de uno más grande expresión, el valor de la última cosa que se evalúan en el gran expresión se convierte en el valor de la gran expresión. Para tomar el ejemplo de (FOR i = 1 TO 10 DO (print i)), el valor del bucle for es la de «10», que hace que el (print i) expresión se evalúa 10 veces, cada vez que regreso me como una cadena. El tiempo final a través de la devuelve 10, nuestra respuesta final

    A menudo requiere de un ligero cambio de mentalidad para obtener el máximo provecho de una expresión basada en el idioma, ya que el hecho de que todo es una expresión que hace posible ‘inline’ un montón de cosas

    Como un ejemplo rápido:

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

    es perfectamente válido para el reemplazo de los no basados en la expresión de

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

    En algunos casos, el diseño que se basa en la expresión de código permite que se siente mucho más natural para mí

    Por supuesto, esto puede llevar a la locura. Como parte de un proyecto hobby en una expresión basada en el lenguaje de scripting llamado MaxScript, me las arreglé para llegar a este monstruo de la línea de

    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
    )
  10. 3

    Una declaración es un caso especial de una expresión, uno con void tipo. La tendencia de idiomas para el tratamiento de las declaraciones de diferente manera a menudo causa problemas, y sería mejor si fueran correctamente generalizada.

    Por ejemplo, en C# tenemos muy útil Func<T1, T2, T3, TResult> sobrecargado conjunto de delegados genéricos. Pero también tenemos que tener su correspondiente Action<T1, T2, T3> conjunto, y de propósito general, de orden superior de la programación constantemente tiene que ser duplicado para lidiar con este lamentable 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 de acuerdo con la posibilidad de TResult ser void? Sí. Todo lo que tiene que hacer es exigir que el retorno es seguido por una expresión que es de tipo void. El resultado de default(void) sería de tipo void, y el func se aprobó en la tendrían que ser de la forma Func<TValue, void> (que sería el equivalente a Action<TValue>).

    Un número de otras respuestas implican que no se puede de la cadena de declaraciones como usted puede con las expresiones, pero no estoy seguro de que esta idea viene de. Podemos pensar que la ; que aparece después de las declaraciones como un infijo binario operador, teniendo dos expresiones de tipo void y combinarlas en una sola expresión de tipo void.

  11. 2

    Declaraciones -> Instrucciones a seguir de manera secuencial

    Expresiones -> Evaluación que devuelve un valor

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

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

    Ejemplos de Afirmaciones:

    for
    goto
    return
    if

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

    Ejemplo de expresiones:

    2+2

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

    • Cuáles son los efectos secundarios?
  12. 1

    Declaraciones son gramaticalmente oraciones completas. Las expresiones no. Por ejemplo

    x = 5

    se lee como «x recibe 5.» Esta es una oración completa. El código

    (x + 5)/9.0

    lee, «x + 5 todo dividido por la 9.0.» Esta no es una oración completa. La declaración de

    while k < 10: 
        print k
        k += 1

    es una oración completa. Aviso de que el bucle de encabezado no es; «mientras k < 10,» es un subordinar la cláusula.

    • while es una expresión lenguajes como Scala. Se están mezclando la gramática con la mecanografía. Consulte mi respuesta.
    • Aquí está el bucle while en scala: tutorialspoint.com/scala/scala_while_loop.htm El lazo con su predicado y no hay cuerpo no es un gramaticalmente frase completa. No es una expresión completa. Usted necesita el cuerpo para completar que es una expresión.
    • Un while con un cuerpo está todavía en una expresión en la Scala. También puede ser una declaración de si se crea efectos secundarios, que lo que mi fuertemente votada abajo de respuesta permite (una expresión también puede ser una declaración). Mi respuesta es la única correcta. Lo siento a todos aquellos lectores que no pueden entender.
  13. 1

    Declaración de,

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

    Una serie de declaraciones rodeado por llaves formar un bloque de código. Del 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;
        }
    }

    Declaraciones en C# a menudo contienen expresiones. Una expresión en C# es un fragmento de código que contiene un valor literal, un simple nombre, o un operador y sus operandos.

    Expresión,

    Una expresión es un fragmento de código que puede ser evaluado para un solo valor, objeto, método, o espacio de nombres. Los dos tipos de expresiones más simples son literales y nombres simples. Un literal es un valor constante que no tiene nombre.

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

    I y s son simples nombres de la identificación de las variables locales. Cuando estas variables se utilizan en una expresión, el valor de la variable es recuperada y utilizada para la expresión.

    • Prefiero escribir if(number >= 0) return true; else return false; o incluso mejor bool? IsPositive(int number) { if(number > 0) return true; else if(number < 0) return false; else return null;} 🙂
  14. 1

    Prefiero el significado de statement en la lógica formal sentido de la palabra. Es uno que cambia el estado de una o más de las variables en el cálculo, lo que permite una verdadera o falsa declaración acerca de su valor(s).

    Supongo que siempre habrá confusión en el mundo de la computación y la ciencia en general, cuando una nueva terminología o palabras introducidas, palabras existentes son «reutilizados» o los usuarios son ignorantes de la existente, establecido o ‘correcto’ de la terminología para lo que están describiendo

  15. 1

    No estoy realmente satisfecho con ninguna de las respuestas aquí. Miré a la gramática de C++ (ISO, 2008). Sin embargo, tal vez por el bien de la didáctica y la programación de las respuestas podría ser suficiente para distinguir los dos elementos (la realidad se parece más complicado, aunque).

    Una declaración consta de cero o más expresiones, pero también pueden ser otros conceptos de lenguaje. Este es el Extended Backus Naur form 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++.

    • de expresión de la declaración des se explica por sí mismo (una declaración que puede constar de cero o más expresiones, leer la gramática cuidadosamente, es difícil)
    • case , por ejemplo, es un la etiqueta-declaración
    • a la selección de la declaración des son if if/else, case
    • iteración-declaracións son while, do...while, for (...)
    • de saltar la declaracións son break, continue, return (a) puede regresar expresión), goto
    • declaración-declaración es el conjunto de declaraciones
    • tratar de bloque está la declaración en representación de try/catch bloques
    • y puede haber algo más abajo de la gramática

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

    expression:
            assignment-expression
            expression "," assignment-expression
    assignment-expression:
            conditional-expression
            logical-or-expression assignment-operator initializer-clause
            throw-expression
    • expresiones son o contienen a menudo asignaciones
    • condicional-expresión (sonidos engañosa) se refiere al uso de los operadores (+, -, *, /, &, |, &&, ||, …)
    • tiro expresión – uh? el throw cláusula es una expresión demasiado
  16. 0

    Aquí se presenta el resumen de una de las respuesta más sencilla que he encontrado.

    originalmente Contestada por Anders Kaseorg

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

    Expresiones pueden ser combinados «horizontal» en las grandes expresiones de uso de los operadores, mientras que las instrucciones sólo pueden ser combinados «verticalmente» por escrito una después de la otra, o con el bloque de construcciones.

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

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

  17. -4

    Para mejorar y validar mi respuesta anterior, las definiciones de lenguaje de programación términos deben ser explicados a partir de informática tipo de teoría, cuando corresponda.

    Una expresión tiene un tipo distinto de la parte Inferior de tipo, es decir, tiene un valor. Una declaración en la Unidad o en la parte Inferior de tipo.

    De esto se sigue que una declaración sólo puede tener cualquier efecto en un programa cuando se crea un efecto secundario, ya que cualquiera no puede devolver un valor, o es sólo devuelve el valor del tipo de Unidad que es información no asignable (en algunos idiomas, tal C void) o (como en la Scala) puede ser almacenado por un retraso en la evaluación de la declaración.

    Obviamente un @pragma o un /*comment*/ no tienen ningún tipo y por lo tanto se diferencian de las afirmaciones. Por lo tanto, el único tipo de instrucción que no tienen efectos secundarios sería un no-funcionamiento. No es sólo útil como un marcador de posición para el futuro de efectos secundarios. Cualquier otra acción debido a una declaración sería un efecto secundario. De nuevo un compilador sugerencia, por ejemplo,@pragma, no es una instrucción, ya que no tiene ningún tipo.

  18. -9

    Más precisamente, una declaración debe tener un «efecto secundario» (es decir,ser imprescindible) y una expresión debe han un valor tipo (es decir, no a la parte inferior de tipo).

    La tipo de una declaración es el tipo de unidad, pero debido a la Paralización de teorema de la unidad de ficción, es por lo que permite decir que el fondo tipo.


    Void no es precisamente la parte inferior de tipo (no es el subtipo de todos los tipos posibles). Existe en los idiomas que no tiene un completamente el tipo de sonido del sistema. Esto puede sonar como un esnob declaración, pero integridad como anotaciones de variación son críticos para la escritura de software ampliable.

    Vamos a ver lo que Wikipedia tiene que decir sobre este asunto.

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

    En el equipo de programación de una instrucción es el más pequeño elemento independiente de un imperativo lenguaje de programación que expresa alguna acción para llevarse a cabo.

    Muchos idiomas (por ejemplo, C) hacer una distinción entre las declaraciones y definiciones, con una declaración que sólo contiene el código ejecutable y una definición de declarar a un identificador, mientras que una expresión se evalúa a un valor único.

    • Por favor, no redefinir general de términos técnicos de la ‘expresión’ y la ‘declaración’. Mis comentarios y respuestas son correctas para C#. Si f(); es de tipo void y no tiene efectos secundarios, entonces es un NOOP. Un buen compilador no permitirá NOOPs. Si f(); no tiene efectos secundarios y su valor de retorno no se utiliza, es también un NOOP. Me hizo responder a la pregunta w.r.t. C#. Me respondió con una precisa la sentencia. La frase es correcta para C#. He elaborado sobre lo void en C# significa en términos de tipo de teoría. Tipo de teoría se aplica a C#.
    • Ver mis comentarios en Marca Cidade la respuesta que explique por qué una declaración a menudo es en realidad la parte inferior tipo y no del tipo de la unidad. Decir que un enunciado «hace algo» es muy impreciso, como una expresión también «hace algo», sino que se evalúa como un valor. Yo sé lo que la gente está tratando de decir, solo que no se elija palabras precisas y definiciones. La palabra exacta es (una afirmación no debe ser) referentially transparente (es decir, imperativo). Que es más preciso que «hace algo» o «efectos secundarios».
    • Una declaración no necesita tener un efecto secundario. Por ejemplo, en python pass es una declaración. Es una no-op, y no se evalúa para nada.
    • Si no tiene un efecto secundario, entonces es una expresión o una NOOP. Un NOOP no hace nada, por lo que puede ser eliminado del programa. Se trata de un simple proceso de eliminación lógica. Si no se define declaración como exigir a un lado-efecto, luego de la declaración es la misma que la de la expresión. Lo otro atributo podría utilizar para diferenciar una declaración de una expresión?
    • -1 Esto es incorrecto. Una declaración no tenía para tener un efecto. Consulte la sección 1.5 de la Especificación del Lenguaje C#. No sólo es no especificar que las declaraciones de debe tienen efectos secundarios, pero también enumera varias declaraciones en las que puede tener no efectos secundarios.
    • He leído que la sección. Declaración, la Expresión, Selección, Iteración, y Saltar declaraciones pueden crear todos los efectos secundarios. Pero si hay un RT expresión, entonces no es una declaración. Me doy cuenta de que la especificación está igualando las expresiones con las declaraciones, pero esta pregunta por la diferencia entre ellos. Por lo tanto la pregunta no tiene respuesta, o si usted está tomando la C# spec demasiado literalmente. La parte superior votado respuesta está tratando de decir lo que yo hice. Pero «hace algo» no tiene sentido. «efectos secundarios» es la forma más significativa para decir que «hace algo». Tenemos que pensar, no sólo a regurgitar.
    • Estás en lo correcto. La documentación oficial es mal. Marc Gravell y Jon Skeet, que son posiblemente los más respeto C# carteles activa en las afueras de Eric Lippert, son mal. Yo, y todos los demás que, votada abajo usted y dejado comentarios explicando nuestra posición son mal. Estás en lo correcto. Claramente eres la única persona que sabe de lo que habla, ya que son mucho más inteligentes que el resto de los de ENTONCES.
    • Ellos son muy correcto acerca de la manera en que la mayoría de C# que quieren los usuarios a comprender los conceptos. Pero estoy mostrando una gran vista de imagen, pehaps no habían sido expuestos. Entiendo disonancia cognitiva, sufro demasiado. He hecho similar más estrecha de las hipótesis en el pasado. Yo solía venir desde la C/C++/C# mundo, así que sé lo duro que fue para mí ajustar a Haskell, Scala, y conceptos más generales. Pero estoy dispuesto a aceptar que mis respuestas no son tan útiles como los demás en este contexto. Así que digamos que usted está correcto en un sentido
    • Conocer la definición precisa de conceptos como el de declaración, de expresión, de fundición, conversión, etc. tiene cero impacto en el 99,999% de la vida cotidiana de las tareas de programación. Pensar acerca de que. También: la mayoría de las personas no se preocupan por Haskell y Scala.
    • Pero si puedo, plz pensar acerca de esto. Si la expresión es distinta de la declaración, ¿cuál es el atributo distintivo? «Hace algo»? Definir «algo». Creo que usted encontrará que mi respuesta es la misma que la parte superior votado respuesta. Me acaba de definir lo que «algo». El C# especificación es sólo de ser literal como una conveniencia. No se espera que usted piensa que las expresiones no son distintas de las afirmaciones. O usted cree que las expresiones son sólo un subconjunto de las declaraciones, pero que no funciona. Debo mostrar cómo que no puede trabajar? ¿
    • Nunca dije que las expresiones son sólo un subconjunto de instrucciones. Pero de nuevo, eso es irrelevante.
    • De hecho, Haskell es obtuso y debido a la evaluación diferida tiene el espacio y el tiempo indeterminismo, que hace que sea muy difícil de depurar. También no tiene la herencia virtual. Scala corrige muchas de estas cosas y es la de más rápido crecimiento de idioma ahora, pero todavía muy pequeños adopción. Scala es bastante buena, pero su sintaxis tiene muchas variantes, por ejemplo, 9 maneras de escribir una función, y otras cuestiones. También ligado a la bibliotecas de Java para la mayoría de la parte por ahora. Hace C# ejecutar en Android? Bien bueno que usted no piensa que las expresiones son subconjunto de instrucciones. ¿Qué significa «hace algo» significa? ¿Qué es «algo»?
    • permítanos seguir esta discusión en el chat
    • Yo respeto a los chicos. Yo nunca podría responder a todas las preguntas que hacen. Su conocimiento es mucho más amplio que el mío. Son realmente profunda y actual de la codificación en estas plataformas. Que tienen probablemente mucho más energía de la que a mí también. Y ellos son probablemente tan inteligente si no más inteligente que yo. Quiero que quede claro que no es una cuestión de respeto. Sólo quiero que la gente tenga la mente abierta y darle tiempo a las cosas. A veces las cosas no son lo que parecen ser.
    • El especificación del lenguaje C# no no requieren que los estados tienen efectos secundarios. Vacío declaraciones son legales (sección 8.3), si el compilador deja de lado o no. De hecho, debido a que el manejo no-op declaraciones a la izquierda hasta la implementación, incluso NOOPs puede afectar potencialmente el código compilado y el rendimiento del programa. Entonces, la respuesta es académicamente y prácticamente equivocado.
    • Si NOOPs ser compilado o no es irrelevante de todos modos. { return 5; } es una declaración de que no produce efectos secundarios, a menos que redefinir «efecto secundario» para incluir a devolver un solo valor. No sólo no es éste el significado aceptado (incluso en Haskell), es sólo significativa en una completamente el sentido académico. () => 5 y () => { return 5; } tener el mismo resultado, una vez evaluados, pero uno es una expresión y la otra no.
    • en el nivel abstracto del lenguaje de diseño de un return es sólo una expresión de la que es el valor de la envolvente de la función o es que y un atajo para la redacción de una más compleja if-else estructura, de modo que todas las rutas de código para resolver un valor. Que no los lenguajes funcionales obtener este mal no es de extrañar. Por ejemplo, en la Scala el return puede ser omitido y que sólo puede escribir 5 al final de la ruta de código para la función.
    • pasar declaración definitivamente tiene efectos secundarios. Esto hace que el intérprete de gastar ciclos de CPU para prescindir de ella. También está pensada como marcador de posición para una función que va a agregar efectos secundarios en lugar de la pass declaración así es la manera de indicar los futuros efectos secundarios.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea