una matriz matrices llenar hacer como columnas codigo caracteres cadenas bidimensionales arreglos arreglo c++ c arrays

c++ - matrices - Inicialización de matriz en C



matriz de caracteres en c (7)

C es un lenguaje permisivo de bajo nivel. Permite afectar un puntero a un int.

int array1 = {1,2,3,4,5};

EDITAR:

Debería haberlo probado con diferentes compiladores antes de escribir cosas estúpidas.

Esto es rechazado como error por MSVC (2008).

Tanto gcc como clang emiten un aviso de excess elements in scalar initializer y simplemente afectan de 1 a a .

Tengo dudas sobre el siguiente código:

int main() { int array1 = {1,2,3,4,5}; //error in c++ , warning in c int array2[] = {1,2,3,4,5}; int array3[5] = {1,2,3,4,5}; }

Este fragmento de código da un error en la línea 3 en c++ pero no en c ?

Sé que array1 es en realidad un int y array2 y array3 son arreglos, así que ¿por qué un compilador de c no muestra un error, sino solo una advertencia: "exceso de elementos en la inicialización escalar"

¿Existe un uso de tal definición y por qué es válida en c ?


Como dice su compilador, esto tampoco es correcto para C Lo importante a tener en cuenta aquí es que, en caso de que se produzcan "infracciones de restricción" (el término oficial), el compilador puede producir un diagnóstico (lo que hizo su compilador) y continuar.

Por eso, en general, debe asegurarse de que su código se compile sin ningún tipo de diagnóstico.


Como todos los demás, asumo que la línea sobre la que te estás preguntando es:

int array1 = {1,2,3,4,5};

En este caso, no hay diferencia entre C y C ++; la línea es posiblemente legal en ambos idiomas, pero no significa lo que piensas. Tanto en C como en C ++, hay una declaración en el sentido de que si el tipo es un tipo escalar ( int es), entonces el contenido de {...} debe ser una sola expresión. Y 1,2,3,4,5 puede interpretarse como una expresión única (con el operador de coma); algo como:

int array1 = 1, 2, 3, 4, 5;

es claramente legal

Sin embargo, es algo ambiguo, ya que en ambos idiomas, la gramática para este tipo de inicialización hace que la puntuación no sea un operador. Así que es una cuestión de interpretación; es la afirmación de que el contenido debe ser una expresión única, una restricción en la gramática (lo que haría que la coma se convierta en un operador) o una restricción en los resultados de evaluar la gramática especificada. Mi sensación intuitiva es que la segunda es la intención, y que la declaración debería dar como resultado un error. Pero la diferencia no es entre C y C ++, sino entre la forma en que los autores de los compiladores interpretan el estándar.

EDITAR:

Al releer un poco más de cerca: en el estándar C ++, dice explícitamente que

Si T es un tipo escalar, entonces una declaración de la forma

T x = { a };

es equivalente a

T x = a;

Lo que no deja mucho margen de maniobra: en C ++, la afirmación parece claramente legal; Es solo en C donde hay cierta ambigüedad.


Es válido según la especificación C

Cita de la sección 6.7.9 de C11 (Inicialización):

Sintaxis

1 initializer: assignment-expression { initializer-list } { initializer-list , }

Por lo tanto, un inicializador puede ser una expresión directa (expresión assignment-expression arriba) o una lista de inicializadores entre llaves. Las restricciones en esa sección de la norma no limitan esto para las variables "normales" (sin matriz o sin puntero).

Eso te permite escribir, por ejemplo,

int a = { 1 };


La forma correcta de inicializar una matriz en C / C ++ es:

int array2[] = {1,2,3,4,5};

Aquí los corchetes le informan al compilador que se trata de una matriz, un conjunto de números en su caso. En esa forma de inicialización no es necesario especificar la longitud de la matriz. El compilador lo sabrá.

La segunda forma es definir una matriz y post inicializarla:

int array3[5]; int *array = new int[5];

En este caso, deberá informar al compilador qué tamaño tendrá la matriz. Además, en el segundo caso necesitas borrar la memoria manualmente.


No es válido en C. Solo tiene menos comprobaciones en el código. Este es un comportamiento indefinido.

De: C11 borrador N1570; 6.7.9 Inicialización

Restricciones
2 Ningún inicializador intentará proporcionar un valor para un objeto que no esté contenido dentro de la entidad que se está inicializando.
3 El tipo de entidad a inicializar será una matriz de tamaño desconocido o un tipo de objeto completo que no sea una matriz de longitud variable.

Definitivamente rompe la restricción 2. ¿Es un int un tipo de objeto completo ?

Del anexo J.2 (comportamiento indefinido):

El inicializador para un escalar no es ni una sola expresión ni una sola expresión entre llaves (6.7.9).

extra:
@James Kanze:

prog.c:4:12: error: expected identifier or ‘(’ before numeric constant int i = 1,2,3,4,5; ^

Puedes hacerlo, pero necesitas convertirlo en una expresión:

int i = (1,2,3,4,5); //need parenthesis, evaluates to 5, values 1-4 thrown away.

La compilación con un int inicializado con una lista de inicializadores genera una advertencia (en gcc):

prog.c:5:2: warning: excess elements in scalar initializer [enabled by default] int j = {1,2,3,4,5}; ^

pero parece que el compilador es lo suficientemente inteligente como para inicializar solo el int y no la siguiente memoria. demo


No es válido C. Ver C11 6.7.9:

Ningún inicializador intentará proporcionar un valor para un objeto que no esté contenido dentro de la entidad que se está inicializando.

Supongo que está utilizando gcc. Luego, si desea que su programa se comporte como C estándar estricto, compílelo como tal:

gcc -std=c11 -pedantic-errors

da

error: exceso de elementos en el inicializador escalar