2010-11-28 19 views
5

Probablemente se lo han dicho, se creen que sí. y -> son operadores que recuperan miembros de una estructura (C) o clase (C++).Son. y -> en C y C++ ¿realmente operadores?

Sin embargo, dudo que sean operadores, porque si son operadores, ¿cuáles son sus tipos de entrada? Además, los identificadores de ambos lados son interdependientes, una característica que, por ejemplo, carece el operador +.

Si esto es correcto, ¿en qué sentido se sigue etiquetando como operador en la práctica y cuál es su definición formal con respecto a la teoría del lenguaje?

+1

* enseñado *. . . . – Inverse

Respuesta

1

Esta referencia dice que son los dos operadores en C++:

http://www.cplusplus.com/doc/tutorial/operators/

eso no es suficiente autoridad?

+0

Gracias, lo es. La misma pregunta podría haberse formulado para, p. Ej. tipos de fundición, resoluciones de alcance, que el estándar considera como operadores. Sin embargo, me siento incómodo con los operadores que no tienen un prototipo de función en general. – shuhalo

+0

Ver también el último párrafo de http: // stackoverflow.com/questions/104618/what-does-mean-in-f/105559 # 105559 – Brian

+3

Como dije en otro comentario, la apelación a la autoridad es un argumento inválido ampliamente reconocido. Es posible que el comité de estándares de C++ y los que participan en la definición del lenguaje elijan mal sus palabras. En este caso no lo hicieron, pero aún hay espacio para explicar * por qué * la redacción es apropiada, en lugar de simplemente decir "tal y tal lo dice". – Steve314

1

Puede sobrecargar el operador ->: Wikipedia. Esa página también indica que no se puede sobrecargar el punto. Hay un ejemplo de -> sobrecarga here:

class String // this is handle 
{ 
    ... 
    Stringrep *operator ->() const { return b_; } 
    private: 
    Stringrep *b_; 
} 

La flecha funciona en el valor a la izquierda de la flecha y vuelve cualquiera que sea el lado izquierdo está "llevando por dentro". Piense en un smart pointer.

5

Creo que el hecho de que pueda sobrecargar al operador -> con la palabra clave "operador" debería ser un obsequio irrelevante.

punteros inteligentes lo hacen con bastante frecuencia:

template<class T> 
struct myPtr { 
    T *operator ->() { return m_ptr; } 

    private: 
     T *m_ptr; 
}; 

El . no es sobrecargable, pero es también un operador por definición.

1

El estándar C++ 03 se refiere a ambos como operadores.

Ejemplo:

... después de la. operador aplicado a una expresión del tipo de su clase ...

Si no se siente cómodo con esa terminología, puede usar el término punctivo para ..

6

Suponiendo que los únicos tipos que se pueden pasar como argumentos a un operador son tipos que se pueden definir dentro del lenguaje.

Argumentaría que cualquier tipo que pueda ser reconocido por el compilador se puede pasar como argumento, incluidos los tipos internos como "identificador". El operador tendrá dos argumentos en su representación AST, que es suficiente para permitirle definir semántica.

Otro argumento es que la teoría del lenguaje puede proporcionar un conjunto de definiciones para su vocabulario, pero no es el único.

Por ejemplo, un operador puede ser un hombre que trabaja en una máquina. Esa definición no tiene relevancia para la teoría de la programación, pero no me impedirá usar palabras clave en un lenguaje específico de dominio que exprese algo relacionado con el funcionamiento de la máquina.Del mismo modo, el término "operador" tiene una definición más amplia en matemáticas que la que es específica de la teoría de programación, y esa definición no se invalida simplemente trabajando con un lenguaje de programación.

Dicho de otra manera: si no lo llamó operador, ¿qué sería lo llama?

EDITAR

Para aclarar, mi primer argumento se refiere a la sintaxis para utilizar el operador (la llamada). Estos operadores tienen argumentos correctos que son identificadores, nombres de miembros, que el lenguaje C++ no puede expresar utilizando un tipo de datos. El lenguaje C++ tiene tienen punteros de miembro, pero no son lo mismo que los miembros, al igual que una variable no es lo mismo que un puntero a esa variable.

Supongo que es a lo que se refiere la pregunta. El parámetro correcto de esos operadores tiene un tipo que no se puede expresar o manipular normalmente en el idioma.

Lo que sucede cuando esa sintaxis se asigna a una función operator-> sobrecargada es algo diferente. La función no es el operador, es solo cómo se implementa el operador.

3

Hmmm ... sizeof es un operador, ¿cuál es su tipo de entrada? No creo que la pregunta sea útil para distinguir operadores de no operadores en este contexto.

Y que habría debido a lo "operador" en el contexto de un lenguaje de programación es exactamente lo que el autor de la lengua dice que significa. Sombras de Lewis Carroll aquí.

+0

En términos de teoría de programación, por supuesto, es más probable que sizeof se considere una función. Actuar en tiempo de compilación en lugar de tiempo de ejecución es además del punto. Ser una función intrínseca del compilador en lugar de un usuario/biblioteca es además del punto. Y el hecho de que el tipo de argumento sea "tipo de datos", un tipo que no se puede pasar como un parámetro para sus propias funciones, es además del punto, ya sea que sizeof sea una función o un operador. Los estándares y la jerga de C y C++ dan definiciones alternativas con su propia historia, pero incluso Lewis Carroll estaba haciendo una broma relacionada con Cratylus. – Steve314

+0

BTW - Todavía te di +1 para la referencia de Lewis Carroll. Muy relevante para el pequeño desacuerdo que estoy teniendo. – Steve314

+0

@ Steve314: Tal definición de una "función" (que engloba 'sizeof') parecería ser un poco diferente de la de un operador: el operador' + 'podría llamarse igualmente una" función ". – caf

1

línea C estándar (n1256): miembros

6.5.2.3 Estructura y unión

Restricciones

1 El primer operando del operador . tendrá una estructura calificado o no calificado o unión tipo, y el segundo operando debe nombrar un miembro de ese tipo.

2 El primer operando del operador -> tendrá tipo '' puntero a calificado o no calificado estructura '' o '' puntero a la unión calificado o no calificado '', y el segundo operando deberá nombre de un miembro del tipo de puntas a.

Son operadores, y sus tipos de entrada están especificados por la norma.

0

jaja, sé que la gente ya ha dicho esto de una manera indirecta, pero solo para decirlo directamente. En términos de C, etiqueta-> es en realidad una forma abreviada de (* etiqueta). .Habiendo dicho eso, . es el operador que hace referencia a elementos en una estructura. Por lo tanto, -> hace referencia a un elemento en un puntero a una estructura.

+0

En términos C sí, pero las etiquetas incluyen C++. Cuando se sobrecarga, hay un 'operador->' separado de 'operator *', por lo que el argumento "taquigrafía" no se aplica necesariamente. Dicho esto, sigue siendo una buena práctica asegurarse de que la taquigrafía se aplique efectivamente: si sobrecarga 'operator->' y 'operator *', debe sobrecargarlos de manera consistente (y teniendo en cuenta la semántica esperada del puntero). – Steve314

+0

cierto, estaba hablando en términos c. sin embargo, considero que la sobrecarga -> en C++ es una mala práctica. – chacham15

+0

Estoy de acuerdo, realmente. Hay algunas inconsistencias que ocurren porque los punteros inteligentes e iteradores generalmente solo implementan el operador *. Si -> era solo una abreviatura - siempre disponible cuando tenía sentido, y no necesitaba operador -> - evitaría algunas molestias. – Steve314

Cuestiones relacionadas