tipos signos seguido reglas puntuacion puntos punto ortograficos ejemplos coma aparte c++ c comma

c++ - signos - ¿Qué significa una lista de valores separados por comas, entre paréntesis, significa en C? a=(1, 2, 3);



signos ortograficos (6)

Es un operador de coma. La norma C11 informa sobre un caso de uso de este tipo de operador.

C11 standard 6: 5: 17

Operador de coma

El operando izquierdo de un operador de coma se evalúa como una expresión vacía; hay un punto de secuencia entre su evaluación y la del operando correcto. Luego se evalúa el operando correcto; El resultado tiene su tipo y valor.

El operador de coma (como se describe en esta subcláusula) no puede aparecer en contextos donde se usa una coma para separar elementos en una lista (como argumentos a funciones o listas de inicializadores). Por otro lado, se puede usar dentro de una expresión entre paréntesis o dentro de la segunda expresión de un operador condicional en tales contextos. En la llamada a la función f (a, (t = 3, t + 2), c) la función tiene tres argumentos, el segundo de los cuales tiene el valor 5.

Esta pregunta ya tiene una respuesta aquí:

Acabo de encontrar un código que esencialmente hace lo siguiente:

int a = (1, 2, 3);

Nunca he visto esta notación antes. Qué significa eso?


Este es el operador de coma . "Envuelve" varias expresiones, las evalúa de izquierda a derecha y el valor de toda la expresión está determinado por la última subexpresión. En tu ejemplo, se evalúa a 3 .

Una situación en la que el operador de coma es especialmente útil es si desea hacer varias cosas en una expresión de "incremento" de bucle for, por ejemplo, para incrementar dos variables.

Ejemplo: Iterar una imagen a lo largo de la diagonal, utilizando y como variables separadas. Utilizo dos variables separadas para x e y porque tal vez quiera cambiar una de ellas en el bucle independientemente de la otra (recuerde, es solo un ejemplo estúpido). Así que quiero incrementar tanto x como y en la declaración de "incremento" del bucle for:

for(int x = 0, y = 0; x < width && y < height; ++x, ++y) { // ... ^^^^^^^^ }

Tenga en cuenta que la expresión de "inicialización" del bucle for no utiliza el operador de coma; sólo declara dos variables.


Este es el operador de coma : la evaluación de a, b primero hace que a se evalúe, luego b , y el resultado es el de b .

int a = (1, 2, 3); primero evalúa 1 , luego 2 , finalmente 3 y usa los últimos 3 para inicializar a . Es inútil aquí, pero puede ser útil cuando el operando de la izquierda tiene efectos secundarios (generalmente: cuando es una llamada de función).


Solo evalúa 1, 2 y 3 (ya que son solo valores, pero también podrían ser llamadas a funciones), y establece el valor (o valor de retorno) del último al operando de la izquierda (en su ejemplo, a).

Quizás esto te ayude a entender cómo funciona:

#include <stdio.h> int toto() { printf("toto()/n"); return (21); } int tata() { printf("tata()/n"); return (42); } int main() { int a = (toto(), tata()); printf("%d/n", a); return (0); }

Salida:

toto() tata() 42

Edición: el código C de Tha, funciona igual en C ++


Utiliza el operador de coma , que solo evalúa cada expresión de operando de manera secuencial (introduciendo puntos de secuencia apropiados en el medio) y devuelve el último. Por lo tanto, su ejemplo es en realidad equivalente a int a = 3; .

Pero, de hecho, es uno de los operadores menos utilizados en C y C ++ y no debe confundirse con las comas utilizadas en las expresiones de llamada de función, las listas de inicializadores y todos los demás lugares. Un caso de uso no tan raro sería múltiples incrementos en los bucles ( for(...; ...; ++i,++j) ), aunque probablemente nunca haya pensado en esto usando una llamada coma operador.

Otro caso de uso interesante es cuando se trata de poner múltiples expresiones relacionadas conceptualmente en una sola declaración (como un retorno) por razones de claridad y concisión, como en una implementación del antiguo viejo frexp con su extraño argumento de retorno de puntero (ignore el hecho de que C ++ correcto solo devolvería un par):

double frexp(double arg, int *exp) { if(...) return *exp=..., result; ... }

que es mucho más simplificado que el equivalente

double frexp(double arg, int *exp) { if(...) { *exp = ...; return result; } ... }