tipos son sirve relacionales que punto programacion para operadores operador los logicos informatica coma c function compiler-construction comma-operator

sirve - que son los operadores en programacion



¿Cómo sabe el compilador que la coma en una llamada a función no es un operador de coma? (6)

Considere la llamada a la función (llamando a int sum(int, int) )

printf("%d", sum(a,b));

¿Cómo decide el compilador que el , utilizado en la función llamada sum(int, int) no es un operador de coma?

NOTA : No quería usar realmente el operador de coma en la llamada a la función. Solo quería saber cómo el compilador sabe que no es un operador de coma.


De C99 6.5.17:

Tal como lo indica la sintaxis, 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 dichos contextos. En la llamada de función

f(a, (t=3, t+2), c)

la función tiene tres argumentos, el segundo de los cuales tiene el valor 5.

Otro ejemplo similar es la lista de inicializadores de matrices o estructuras:

int array[5] = {1, 2}; struct Foo bar = {1, 2};

Si se utilizara un operador de coma como parámetro de función, utilícelo así:

sum((a,b))

Esto no compilará, por supuesto.


Hay múltiples facetas en esta pregunta. Un par es que la definición lo dice. Bueno, ¿cómo sabe el compilador en qué contexto está esta coma? Ese es el trabajo del analizador. Para C en particular, el lenguaje puede ser analizado por un analizador LR (1) ( http://en.wikipedia.org/wiki/Canonical_LR_parser ).

La forma en que esto funciona es que el analizador genera un conjunto de tablas que conforman los posibles estados del analizador. Solo un cierto conjunto de símbolos es válido en ciertos estados, y los símbolos pueden tener diferentes significados en diferentes estados. El analizador sabe que está analizando una función debido a los símbolos anteriores. Por lo tanto, sabe que los posibles estados no incluyen el operador de coma.

Estoy siendo muy general aquí, pero puedes leer todos los detalles en la Wiki.


La razón es la Gramática C. Mientras que a todos los demás parece gustarles citar el ejemplo, el verdadero negocio es la gramática de estructura de frase para llamadas de función en el Estándar (C99). Sí, una llamada de función consiste en el operador () aplicado a una expresión de postfijo (como por ejemplo un identificador):

6.5.2 postfix-expression: ... postfix-expression ( argument-expression-list_opt )

Juntos con

argument-expression-list: assignment-expression argument-expression-list , assignment-expression <-- arglist comma expression: assignment-expression expression , assignment-expression <-- comma operator

El operador de coma solo puede aparecer en una expresión , es decir, más abajo en la gramática. Así que el compilador trata una coma en una lista de argumentos de funciones como la que separa las expresiones de asignación , no como una separación de expresiones .


Las respuestas existentes dicen "porque la especificación del lenguaje C dice que es un separador de listas, y no un operador".

Sin embargo, su pregunta es: "¿cómo sabe el compilador ...?", Y eso es completamente diferente: en realidad no es diferente de cómo el compilador sabe que la coma en printf("Hello, world/n"); no es un operador de coma: el compilador ''sabe'' por el contexto donde aparece la coma, básicamente, lo que pasó antes.

El ''lenguaje'' C se puede describir en Backus-Naur Form (BNF), básicamente, un conjunto de reglas que el parser del compilador usa para escanear su archivo de entrada. El BNF para C distinguirá entre estas diferentes posibles ocurrencias de comas en el lenguaje.

Hay muchos recursos buenos sobre cómo funcionan los compiladores y cómo escribir uno .


Mire la gramática para el lenguaje C. Está listado, en su totalidad, en el Apéndice A de la standard . La forma en que funciona es que puede pasar a través de cada ficha en un programa C y hacer que coincida con el siguiente elemento en la gramática. En cada paso, solo tiene un número limitado de opciones, por lo que la interpretación de cualquier personaje dependerá del contexto en el que aparece . Dentro de cada regla en la gramática, cada línea ofrece una alternativa válida para que el programa coincida.

Específicamente, si busca parameter-list de parameter-list , verá que contiene una coma explícita. Por lo tanto, siempre que el analizador C del compilador esté en el modo "lista de parámetros", las comas que encuentre se entenderán como separadores de parámetros , no como operadores de coma . Lo mismo es cierto para los corchetes (que también pueden ocurrir en las expresiones).

Esto funciona porque la regla de parameter-list tiene cuidado de usar reglas de assignment-expression , en lugar de solo la regla de expression simple. Una expression puede contener comas, mientras que una assignment-expression no puede. Si este no fuera el caso, la gramática sería ambigua, y el compilador no sabría qué hacer cuando encontrara una coma dentro de una lista de parámetros.

Sin embargo, un paréntesis de apertura, por ejemplo, que no es parte de una definición / llamada de función, o una instrucción if , while o for , se interpretará como parte de una expresión (porque no hay otra opción, pero solo si el inicio de una expresión es una elección válida en ese punto), y luego, dentro de los corchetes, se aplicarán las reglas de sintaxis de expression , y eso permite operadores de coma.


standard :

Tal como lo indica la sintaxis, 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 dichos contextos. En la llamada de función f(a, (t=3, t+2), c) la función tiene tres argumentos, el segundo de los cuales tiene el valor 5.

En otras palabras, "porque".