Pregunta

Supongamos que tengo:

int a;
int b;

Son las variables a y b Nombre equivalente (más específicamente, ya que los tipos primitivos no tienen nombres de tipo, ¿se pueden considerar el nombre equivalente)?

Gracias.

¿Fue útil?

Solución

Nombre (más correctamente, nominal) La equivalencia significa que los valores tienen el mismo tipo determinado por el nombre (totalmente calificado) de su tipo, por ejemplo, a y b son de tipo nominalmente equivalente porque ambos tienen el tipo "int". La equivalencia estructural significa que los valores tienen el mismo tipo porque sus tipos son estructuralmente equivalentes, independientemente del nombre. La equivalencia del tipo nominal implica la equivalencia de tipo estructural ya que un tipo con nombre es estructuralmente equivalente a sí mismo. Su a y b, son de tipo nominalmente equivalente porque tienen el mismo tipo por nombre ("int"). La afirmación de que "los tipos primitivos no tienen nombres de tipos" es simplemente falso - int es un nombre de tipo. Y no hay diferencia entre int a; int b; y int a, b; - Ambos definen a y b con el mismo tipo (estructuralmente y por nombre).

El sistema de tipo de C es generalmente por su nombre ... por ejemplo, int * y short* son tipos diferentes incluso si int y short tener la misma representación y struct foo { int x; } y struct bar { int x; } son tipos diferentes a pesar de que siempre tienen la misma representación.

Otros consejos

Algunas notas de clase que encontré parecen indicar que con:

int a;
int b;

Variables a y b no son Nombre equivalente.

Sin embargo, con:

int a, b;

Variables a y b son Nombre equivalente.

No creo que C adopte la equivalencia de nombre. En mi humilde opinión, C adopta equivalencia estructural con excepciones para estructuras y sindicatos; Para ellos se usan los nombres. Es cierto que los valores tienen el mismo tipo determinado por el nombre de su tipo en equivalencia de nombre y que los valores tienen el mismo tipo determinado por estructuralmente equivalente en la equivalencia estructural. Pero incluso en la equivalencia estructural, no se determina independientemente del nombre.

Básicamente, los tipos atómicos en un lenguaje de programación tienen nombres y se usan tanto en equivalencia de nombre como en equivalencia estructural. La diferencia proviene de tipos derivados como int * o char[10]. Es cierto que "los tipos primitivos tienen nombres de tipos". Y el sistema de tipo de C está comparando la estructura de los tipos derivados con nombres definidos por el usuario, excluyendo los sinónimos de tipo typedef.

El sistema de tipo de C es generalmente por estructura ... por ejemplo, int * y short * son tipos diferentes pero int * y int * son los mismos tipos. La razón de eso struct foo { int x; } y struct bar { int x; } son tipos diferentes se debe a que tienen una estructura diferente a los nombres de tipo definidos por el usuario. Tipos struct foo * y struct foo * son los mismos tipos ya que están en la misma estructura. Por favor, no confundas eso struct es para la estructura de tipos. Es solo para definir nombres de tipos, con más precisión los nombres de etiquetas de estructura en C.

Simplemente, en la equivalencia con retención, los tipos se desarrollan hasta nombres de tipo atómico y se comparan. En C, los tipos se desarrollan hasta nombres definidos por el usuario. (Para desarrollar, consulte http://www.csd.uwo.ca/~moreno//cs447/lectures/typechechking.html/node3.html) Esta es la diferencia. Naturalmente, los tipos equivalentes de nombre son estructuralmente equivalentes, pero no lo contrario.

Para el siguiente caso:

int x;
int y;

x y y y tanto equivalente de nombre como equivalente estructural. Pero, en el siguiente caso:

int *x;
int *y;

x y y son equivalentes estructurales pero no equivalentes de nombre. Incluso para el siguiente caso:

int *x, *y;

x y y no se consideran equivalentes en un esquema de equivalencia de nombre estricto, ya que esta declaración se considera solo una taquigrafía de la declaración anterior. ADA es un lenguaje bien conocido que adopta la estricta equivalencia del nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top