6

Hoy en día, descubrí que se puede escribir dicho código en C++ y compilarlo:¿Qué hace esta asignación dinámica?

int* ptr = new int(5, 6); 

¿Cuál es el propósito de esto? Sé por supuesto que la cosa dinámica new int(5), pero aquí estoy perdido. ¿Alguna pista?

+4

Por lo que vale la pena, la forma correcta de hacer esto en este caso es 'int * ptr = new int ((5, 6));'. 'int (5,6)' debería dar como resultado un error, pero colocarlo entre paréntesis lo convierte en un 6 y luego lo usa. Dicho eso, es feo. :) – GManNickG

+0

@GMan: Debes poner esto como una respuesta, para que podamos votarlo. – Zacky112

Respuesta

13

Está utilizando el operador de coma, solo evalúa un valor (el más a la derecha).

El operador coma (,) se utiliza para expresiones separar dos o más que están incluidos donde se espera que sólo una expresión . Cuando se debe evaluar el conjunto de expresiones para un valor , solo se considera la expresión más a la derecha .

Source

La dirección de memoria que el puntero está apuntando a se inicializa con un valor de 6 anterior.

+0

Dado que el operador (,) descarta su primer operando, es lo mismo que el nuevo int (6). ¿Derecha? – Stringer

+3

Sí, eso es correcto. Pero podría tener alguna otra expresión en lugar de 5 que quisiera evaluar y 6 devolver. Evaluará todas las expresiones pero devolverá la última. –

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx Pero en ese enlace, Microsoft dice "Donde la coma se usa normalmente como un separador (por ejemplo, en argumentos reales para funciones o Inicializadores agregados), el operador de coma y sus operandos deben estar entre paréntesis ". ¿La expresión en int (expresión) no contaría como una lista de argumentos y, por lo tanto, no se evaluaría la coma como un separador? – Bob

1

Mi compilador, g ++, devuelve un error al intentar hacer esto.

¿En qué compilador o código viste esto?

+0

Visual Studio 2008. Escribí ese código. – Stringer

+0

Compila en MSVC 6.0 e inicializa la ubicación ptr con el valor 6. –

1

Creo que es un error que significaba asignar algún tipo de matriz 2D. Sin embargo, no puedes hacer eso en C++. El fragmento realmente se compila porque está utilizando el operador de coma, que devuelve la última expresión e ignora los resultados de todos los demás. Esto significa que la instrucción es equivalente a:

int* ptr = new int(6); 
1

Se ignora el 5. esto asigna un int en el montón y lo inicializa a (5,6).

el resultado de un conjunto de sentencias separadas por el operador coma es el valor de la última declaración, por lo que el int es inicializado a 6

1

Basta con hacer esto:

int* ptr = new int(6); 

En lo que comas el operador está preocupado, úselo cuando no puede hacer la tarea deseada sin él. No hay uso de la aplicación de trucos tales como:

int* ptr = new int(5, 6); 
Cuestiones relacionadas