En los lenguajes de programación C y C++ , el operador coma (representado por el símbolo, ) es un operador binario que evalúa su primer operando y descarta el resultado, y luego evalúa el segundo operando y devuelve este valor (y tipo). Existe un punto de secuencia entre estas evaluaciones.
El uso de la coma como operador es distinto de su uso en llamadas y definiciones de funciones, declaraciones de variables , declaraciones de enumeraciones y construcciones similares, donde actúa como separador .
Sintaxis
El operador coma separa expresiones (que tienen valor) de forma análoga a como el punto y coma finaliza sentencias, y las secuencias de expresiones se encierran entre paréntesis de forma análoga a como las secuencias de sentencias se encierran entre llaves: [ 1 ](a, b, c) es una secuencia de expresiones, separadas por comas, que se evalúa a la última expresión c, mientras que {a; b; c;}es una secuencia de sentencias y no se evalúa a ningún valor. Una coma solo puede aparecer entre dos expresiones; las comas separan expresiones, a diferencia del punto y coma, que aparece al final de una sentencia (que no es de bloque); los puntos y coma finalizan sentencias.
El operador coma tiene la precedencia más baja de todos los operadores de C y actúa como un punto de secuencia . En una combinación de comas y puntos y comas, los puntos y comas tienen menor precedencia que las comas, ya que los puntos y comas separan las instrucciones, mientras que las comas aparecen dentro de las instrucciones, lo que concuerda con su uso como puntuación ordinaria: a, b; c, dse agrupa como (a, b); (c, d)porque son dos instrucciones separadas.
A partir de C++20 , el operador coma se ha desaconsejado en expresiones de subíndices para reducir la confusión y abrir la posibilidad futura de reutilizar la sintaxis para la indexación de matrices multidimensionales. [ 2 ] En C++23operator[] , se añadió la capacidad de sobrecargar con múltiples argumentos, lo que hace que las expresiones de coma sin paréntesis sean inutilizables en subíndices. [ 3 ] El operador coma sigue siendo utilizable y no está desaconsejado en este contexto si la expresión de coma está rodeada de paréntesis (como en a[(b,c)]).
Ejemplos
Usos
El operador coma tiene casos de uso relativamente limitados. Debido a que descarta su primer operando, generalmente solo es útil cuando el primer operando tiene efectos secundarios deseables que deben secuenciarse antes del segundo operando. Además, debido a que rara vez se usa fuera de modismos específicos, y se confunde fácilmente con otras comas o el punto y coma, puede resultar confuso y propenso a errores. Sin embargo, existen ciertas circunstancias en las que se usa comúnmente, especialmente en bucles for y en SFINAE . [ 4 ] Para sistemas embebidos que pueden tener capacidades de depuración limitadas , el operador coma se puede usar en combinación con una macro para sobrescribir sin problemas una llamada a función, para insertar código justo antes de la llamada a la función.
bucles for
El operador coma permite múltiples sentencias de asignación sin usar una sentencia de bloque, por ejemplo, en las expresiones de inicialización e incremento de un bucle for . En el siguiente ejemplo, el orden de los inicializadores del bucle es importante:
void rev ( char * s , size_t len ) { char * first ; for ( first = s , s += len ; s >= first ; -- s ) { putchar ( * s ); } }Una solución alternativa a este problema en otros lenguajes es la asignación paralela , que permite realizar múltiples asignaciones dentro de una misma instrucción y también utiliza una coma, aunque con una sintaxis y semántica diferentes. Esto se utiliza en Go en su bucle for análogo. [ 5 ]
Macros
La coma se puede utilizar en las macros del preprocesador para realizar múltiples operaciones en el espacio de una sola expresión sintáctica.
Un uso común es proporcionar mensajes de error personalizados en caso de que la aserción falle. Esto se logra pasando una lista de expresiones entre paréntesis a la assertmacro, donde la primera expresión es una cadena de error y la segunda es la condición que se está verificando. La assertmacro muestra su argumento tal cual en caso de que la aserción falle. A continuación, se muestra un ejemplo:
for ( int i = 0 ; i <= 9 ; i ++ ) { assert (( "i es demasiado grande!" , i <= 4 )); printf ( "i = %i \n " , i ); }Condición
La coma se puede usar dentro de una condición (de un if, while, do while o for) para permitir cálculos auxiliares, en particular llamar a una función y usar el resultado, con ámbito de bloque :
if ( y = f ( x ), y > x ) { // instrucciones que involucran x e y }Existe un modismo similar en Go , donde la sintaxis de la instrucción if permite explícitamente una instrucción opcional. [ 6 ]
Retorno complejo
La coma se puede usar en las instrucciones de retorno para asignar un valor a una variable global o a un parámetro de salida (pasado por referencia). Esta convención sugiere que las asignaciones forman parte del retorno, en lugar de ser asignaciones auxiliares en un bloque que finaliza con el retorno propiamente dicho. Por ejemplo, al establecer un número de error global:
if ( failure ) { return ( errno = EINVAL , -1 ); }Evita una cuadra
Para mayor brevedad, se puede usar la coma para evitar un bloque y las llaves asociadas, como en:
si ( x == 1 ) y = 2 , z = 3 ;Sobrecarga
C++ permite sobrecargar el operador coma, tanto como operador binario como no miembro. [ 7 ] Sus firmas son:
U&T::operator,(U&rhs);(dentro de la definición de la clase)U&operator,(constT&lhs,U&rhs);(fuera de la definición de clase)
Esto permite el uso de API de estilo DSL , como las siguientes:
Registrador registrador ; registrador , "Hola, " , "mundo!" ;Otros idiomas
En los lenguajes de programación OCaml y Ruby , el punto y coma (";") se utiliza para este propósito.
JavaScript , [ 8 ] Perl [ 9 ] y D [ 10 ] utilizan el operador coma de la misma manera que lo hace C/C++.
Algunos otros lenguajes con sintaxis similar a C, como Java [ 11 ] y C# , no tienen esta característica, aunque C# admite una lista de expresiones separadas por comas en el inicializador y el iterador de una forinstrucción, [ 12 ] lo que permite un equivalente de esto en este contexto específico.
Véase también
Referencias
- ↑ "Operador coma" . Documentación para desarrolladores de Microsoft . Archivado del original el 2 de agosto de 2019. Consultado el 1 de agosto de 2019.
Dos expresiones separadas por una coma se evalúan de izquierda a derecha. El operando izquierdo siempre se evalúa, y todos los efectos secundarios se completan antes de que se evalúe el operando derecho.
- ↑ "P1161R2: Desaconsejar el uso del operador coma en expresiones de subíndice" . www.open-std.org . Consultado el 5 de septiembre de 2022 .
- ^ Mark Hoemmen; Margarita Hollman; Corentin Jabot; Isabel Muerte; Christian Trott (14 de septiembre de 2021). "Operador de subíndice multidimensional" (PDF) .
- ↑ "SFINAE" . en.cppreference.com . Consultado el 30 de agosto de 2022 .
- ↑ Go efectivo : para , "Finalmente, Go no tiene operador coma y ++ y -- son sentencias, no expresiones. Por lo tanto, si quieres ejecutar varias variables en un bucle for, debes usar la asignación paralela (aunque eso excluye ++ y --)."
- ↑ Especificación del lenguaje de programación Go: Sentencias if
- ↑ cppreference.com. "Otros operadores" . cppreference.com . cppreference.com . Consultado el 2 de mayo de 2026 .
- ↑ "Operador coma" . MDN Web Docs . 17 de enero de 2020. Archivado del original el 12 de julio de 2014. Consultado el 25 de enero de 2020.
Puede usar el operador coma cuando desee incluir varias expresiones en un lugar que requiere una sola expresión.
- ↑ "Perlop - Operadores y precedencia de Perl - Navegador de Perldoc" .
- ↑ "Expresiones - Lenguaje de programación D § Expresión con coma" .
- ↑ "¿La coma (,) es un operador o un separador en Java?" .
- ↑ "Instrucciones - Especificación del lenguaje C# | Microsoft Learn § La instrucción for" .
Bibliografía
- Ramajaran, V. (1994), Programación de computadoras en C , Nueva Delhi: Prentice Hall of India
- Dixit, JB (2005), Fundamentos de informática y programación en C , Nueva Delhi: Laxmi Publications
- Kernighan, Brian W.; Ritchie, Dennis M. (1988), El lenguaje de programación C (2.ª ed.), Englewood Cliffs, NJ: Prentice Hall
Enlaces externos
- " Efecto de usar una coma en lugar de un punto y coma en C y C++ ", Stack Overflow
- Boost.Assignment : funcionalidad de la biblioteca Boost que facilita el llenado de contenedores mediante la sobrecarga del operador coma.
- C (lenguaje de programación)
- C++
- Operadores (programación)