C/Visual C - Arreglo Dinámico

 
Vista:

Arreglo Dinámico

Publicado por Franco (36 intervenciones) el 15/07/2005 17:37:54
Hola,

En una serie de ejemplos de un autor siempre usa el signo de admiración de cierre: "!"
De los ejemplos que he visto parece que es para comparara una variable con el valor 0.
Lo que yo reemplazo con i==0, donde i es int, por ejemplo.
Pero en un ejemplo sobre punteros también usa "!".
¿Qué significa en este caso?

Saludos.

===

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main(void)
{
int *p;
int i;
p=new int[5];
clrscr();
if(!p)
{
cout<<"Error de asignacion\n";
exit(1);
}
for(i=0;i<5;i++)
p[i]=i+1;
for(i=0;i<5;i++)
{
cout<<"Este es el entero en p["<<i<<"]:";
cout<<p[i]<<"\n";
}
delete[] p;
getch();
}

===
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Arreglo Dinámico

Publicado por fernando.gomez (1603 intervenciones) el 15/07/2005 17:44:29
! es el operador de negación. Por ejemplo, !false regresa true.

Lo que hace el autor en las siguientes líneas:

p=new int[5];
// ...
if(!p)
{
cout<<"Error de asignacion\n";
exit(1);
}

es sencillo. El operador new (si no se #incluye <new>) regresa NULL si ya no tiene memoria suficiente para realizar la petición de asignación dinámica de memoria. En caso contrario, regresa un puntero a dicha memoria. Como NULL es cero, entonces la condición quiere decir:

Si p no es no-nulo, entonces error de asignación.

o el equivalente,

Si p es nulo, entonces error de asignación.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Arreglo Dinámico

Publicado por Franco (36 intervenciones) el 16/07/2005 07:00:41
Hola,

Gracias. Se van aclaradndo mis ideas.
Pero en el código yo dejo de comentar la sección con el " if(!p) " y ya no funciona.
Si he hecho " p = new int[5] " entonces el puntero p apunta a una dirección de memoria válida y no debe ser NULL. Por lo que la pre-condición del if debería cumplirse y ejecutaría el código en su interior. ¿Por qué no sucede esto?

Gracias.

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main(void)
{
int *p;
int i;
p = new int[5];
/*
if (!p);
{
cout<<"Error de asignacion\n";
getch();
exit(1);
};
*/
for ( i=0 ; i<5 ; i++ )
{
p[i] = i + 1;
cout<<i;
}

cout<<"\n";

for ( i=0 ; i<5 ; i++ )
{
cout<<"Este es el entero en p["<<i<<"]:";
cout<<p[i]<<"\n";
};

delete[] p;
getch();
};

mmm...

o sea en este ejemplo

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
inline int valor(int x) { return ¡!(X%2);} //línea 4
void main()
{
int a;
cout <<"Introducir valor: ";
cin >> a;
if (valor(a))
cout << "Es par ";
else
cout << "Es impar";
}

¿ en la línea 4 hay un error; dice:
inline int valor(int x) { return ¡!(X%2);}
y debería decir:
inline int valor(int x) { return !(X%2);}?

algo más, probé quitando los paréntesis y me gustó mucho que la negación tenga precedencia sobre la operación de módulo ( % )

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar