elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Línea de Código : duda
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Línea de Código : duda  (Leído 9,284 veces)
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Línea de Código : duda
« en: 15 Diciembre 2021, 07:34 am »

La línea de código " resultado = resultado + arreglo[a] " no posee Operador + Sobrecargado,
cierto ? pues entiendo que no se está sumando un Elemento ( resultado ) del Array al mismo
Array ( arreglo[a] ) : Entonces, esto es lo que no entiendo ...... quizá si lo interpreto como   
" i = i + 1 " sea coherente ?? ; o entender que " si en resultado no hay ningún Valor, súmese a este un Valor del Array " (?) 

Código
  1. include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. int a = 0; // Contador a 0
  6.  
  7. int resultado;
  8.  
  9. int cantidad; // Cantidad de Elementos del ARRAY
  10.  
  11.  
  12.  
  13. int main( )
  14. {
  15.  
  16. cout << "\n\tIngrese la Cantidad de N\243meros que desea Sumar :";
  17.  
  18. cin >> cantidad;
  19.  
  20.  
  21. int arreglo[ cantidad ]; // Nombre del ARRAY
  22.                         // Se declara pues será utilizado en el WHILE
  23.                         // reemplazando " a " POR " cantidad "
  24.  
  25.  
  26. while ( a < cantidad ) // Mientras el Nro de veces que se va a repetir ( " a " )
  27.                       // la cantidad de Nros ingresados SEA MENOR a la
  28.                       // " cantidad " de Elementos del ARRAY
  29.                       // ( ya q no queremos que se tenga en cuenta el " \0 " )
  30.  
  31.  
  32. {
  33.  
  34. cout << "\n\tIngrese un N\243mero :";
  35.  
  36.  
  37. cin >> arreglo[a];
  38.  
  39. a ++;
  40.  
  41. }
  42.  
  43. a = 0; // Se resetea el Contador pues será utilizado nuevamente
  44.  
  45.  
  46. while ( a < cantidad )
  47. {
  48. resultado = resultado + arreglo [a];
  49.  
  50. a ++;
  51.  
  52. }
  53.  
  54. cout << "\n\tEL RESULTADO DE LA SUMA DE TODOS LOS NUMEROS INGRESADOS ES :" << "" << resultado << endl;
  55.  
  56. return 0 ;
  57. }

Gracias x leer el Mensaje.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Línea de Código : duda
« Respuesta #1 en: 15 Diciembre 2021, 09:46 am »

No hay ninguna operador sobrecargado, es una elemental suma de enteros entre una variable global y un elemento de un array cuyo resultado se asigna a la variable global.

Es exactamente igual a esto:
Código
  1. resultado += arreglo[a];

1) mayor es una variable global y su valor inicial es 0 por defecto. ¿Que crees que deberia ser? Es eso o un valor indefinido ya que no inicializaste la variable ... por suerte no hace falta al ser una variable global.

Me cito, cambia mayor por resultado.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Línea de Código : duda
« Respuesta #2 en: 15 Diciembre 2021, 20:30 pm »

No entiendo muy bien lo que estás preguntando pero básicamente para entender esa línea tienes que tener claras las siguientes premisas:
  • resultado es de tipo int
  • arreglo es de tipo int[] por lo que arreglo[a] es de tipo int
  • int + int = int
  • El operador = tiene menos preferencia que el operador + por lo que primero se realiza la suma y después la asignación

Y ahora entrando más concretamente en tu código:
  • Como resultado es una variable global y no se ha inicializado, vale 0 (como explica Eternal Idol) -> Con variables locales esto no se cumple -> Es obligatorio inicializarlas (y las globales por claridad también se recomienda inicializarlas explícitamente)
  • Ahora te pongo unos valores de ejemplo para 'arreglo' y vemos lo que está pasando:
Código:
resultado = 0
arreglo = {1, 2, 3, 4}

Iteracion 0 -> resultado = resultado + arreglo[0] -> resultado = 0 + 1 -> resultado = 1
Iteracion 1 -> resultado = resultado + arreglo[1] -> resultado = 1 + 2 -> resultado = 3
Iteracion 2 -> resultado = resultado + arreglo[2] -> resultado = 3 + 3 -> resultado = 6
Iteracion 3 -> resultado = resultado + arreglo[3] -> resultado = 6 + 4 -> resultado = 10
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Línea de Código : duda
« Respuesta #3 en: 16 Diciembre 2021, 05:54 am »

Gracias x tu paciencia: Evidentemenete olvidé lo que me explicó Eternal Idol hace unas
semanas: que como " resultado " es una variable global, no hace falta inicializarla y por defecto
vale " 0 "
Ahora bien; reescribí el Código con todas Variables Locales, e inicializadas ( con excepción de " arreglo " pues espera que el usuario le ingrese Valores) : e igualmente funciona bien ......
Entonces, pues, si me podrías explicar si haber definido a "  ' resultado ' como Local y no Global " - aunque funcione bien el Código - sería un error conceptual ..... o en todo caso:
..... ¿ En qué caso/s específico/s es obligatorio definir a una variable como Global ?

Gracias y Saludos !



No hay ninguna operador sobrecargado, es una elemental suma de enteros entre una variable global y un elemento de un array cuyo resultado se asigna a la variable global.

Es exactamente igual a esto:
Código
  1. resultado += arreglo[a];

Me cito, cambia mayor por resultado.



Gracias : se me pasó que me lo habías recordado.
« Última modificación: 16 Diciembre 2021, 08:15 am por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Línea de Código : duda
« Respuesta #4 en: 16 Diciembre 2021, 08:20 am »

Claro que funciona si inicializas a 0 manualmente una variable local, no hay ninguna razon para esperar un comportamiento diferente.

Necesitas leer algun libro de C++ urgentemente, entender la diferencia entre variables locales y globales es algo muy elemental.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Línea de Código : duda
« Respuesta #5 en: 16 Diciembre 2021, 22:27 pm »

Entonces, pues, si me podrías explicar si haber definido a "  ' resultado ' como Local y no Global " - aunque funcione bien el Código - sería un error conceptual ..... o en todo caso:
..... ¿ En qué caso/s específico/s es obligatorio definir a una variable como Global ?
Realmente el error es el opuesto: definir la variable 'resultado' global cuando en este caso debería ser local.

  • Una variable local sólo es accesible desde dentro del ámbito (scope) en que se define.
  • Una variable global es accesible desde cualquier lugar del código.
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Como dije antes, aunque las variables globales se inicializan a 0 por defecto, es mejor especificarlo para facilitar su lectura
  5. // Normalmente una variable sin inicializar se entiende que se le va a dar un valor concreto mas adelante y que no importa el valor que tenga en este momento
  6. int variableGlobal = 0;
  7. const int CONSTANTE_GLOBAL = 0;
  8.  
  9. void func() {
  10.  int variableLocalFunc = 0;
  11.  
  12.  cout << "Variable global: " << variableGlobal << endl; // Como se llama en el main() despues de modificar el valor de variableGlobal -> Mostrara 10
  13.  cout << "Variable local main: " << variableLocalMain << endl; // ERROR: La variable local de main() no es accesible desde aqui
  14. }
  15.  
  16. int main() {
  17.  // Una variable local no se inicializa a 0 por defecto. Por lo tanto es necesario inicializarla explicitamente (dado el caso)
  18.  // Al igual que antes, se puede dejar sin inicializar si se le va a dar un valor mas adelante (estando seguros de que no se va a usar esta variable antes de darle un valor)
  19.  // Lo de inicializar siempre todas las variables al momento de declararlas ya depende de gustos
  20.  int variableLocalMain = 0;
  21.  
  22.  variableGlobal = 10;
  23.  cout << "Variable global: " << variableGlobal << endl; // Muestra: "Variable global: 10"
  24.  
  25.  constanteGlobal = 10; // ERROR: Es una constante -> No se puede modificar
  26.  cout << "Constante global: " << constanteGlobal << endl; // Muestra: "Constante global: 0"
  27.  
  28.  func();
  29. }

La norma general es:
  • No definir variables globales prácticamente nunca (si estás empezando quédate con que nunca debes definir una variable global). Las variables globales son accesibles desde cualquier parte del programa. Imagina un programa con 200 archivos diferentes y con variables globales, ¿cuántas posibilidades hay de que alguna variable tenga el mismo nombre? ¿Qué pasa si estás usando una variable global en un fichero pero está siendo modificada desde otro fichero? Problemas.
  • Las constantes globales sí están permitidas. En programas muy grandes hay que tener cuidado con declarar cosas globales pero en programas pequeños puedes declarar las constantes que necesites globales por tenerlas todas al principio del fichero y tener así el cuerpo de las funciones más reducido.
  • Si las variables locales sólo son accesibles desde la función en que se crean, ¿cómo puedo acceder a una variable definida en una función desde otra? Te presento: los parámetros (gran invento). Las utilidades de los parámetros es que permite digamos "enviar" variables de una función a otra. Además por defecto estas variables se pasan por valor (se envía una copia) y no por referencia (se envía la original) por lo que si se modifican dentro de la función que las recibe, no afectará a la función que las envió.
  • Si las variables pasadas como parámetro no se ven afectadas fuera de la función, ¿cómo puedo hacer cambios en una variable y que estos se mantengan fuera? Te presento: el valor de retorno (otro gran invento) [o el paso por referencia, pero este es más avanzado, no deberías usarlo si no es estrictamente necesario y si estás empezando no creo que lo sea]
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // Funcion que modifica el parametro pero este no se ve modificado fuera
  5. void incrementVoid(int num) {
  6.  num++;
  7.  cout << "Incremento void: " << num << endl;
  8. }
  9.  
  10. // Funcion que modifica el parametro y lo devuelve para que sea asignado fuera y asi mantener su nuevo valor
  11. int incrementReturn(int num) {
  12.  num++;
  13.  cout << "Incremento return: " << num << endl;
  14.  return num;
  15. }
  16.  
  17. // Funcion que modifica el parametro pasado por referencia -> Modifica el actual entonces no hace falta devolverlo
  18. void incrementReference(int &num) {
  19.  num++;
  20.  cout << "Incremento referencia: " << num << endl;
  21. }
  22.  
  23. int main() {
  24.  int num = 1;
  25.  
  26.  incrementVoid(num); // Mostrara: "Incremento void: 2"
  27.  cout << "Valor num en main: " << num << endl; // Mostrara: "Valor num en main: 1" (no se ha visto modificado)
  28.  
  29.  num = incrementReturn(num); // Mostrara: "Incremento return: 2"
  30.  cout << "Valor num en main: " << num << endl; // Mostrara: "Valor num en main: 2" (en la linea anterior le hemos asignado el valor devuelto por incrementReturn())
  31.  
  32.  incrementReference(num); // Mostrara: "Incremento referencia: 3" (En la linea anterior num ya valia 2 y la funcion le ha vuelto a incrementar 1)
  33.  cout << "Variable num en main: " << num << endl; // Mostrara: "Valor num en main: 3" (la funcion incrementReference() ha modificado la variable num original por lo que el cambio se mantiene)
  34. }

Como ya he dicho, y repito, no debes usar parámetros por referencia de momento. Seguro que lo que estés pensando puedes hacerlo igual con un return.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Línea de Código : duda
« Respuesta #6 en: 17 Diciembre 2021, 05:39 am »

Gracias totales !
Excelente explicación.
Sólo te presento aquí algunas Notas para que leas sobre ( y que me digas si no estoy en lo
correcto en los casos en que fuere ) tu Segundo Código, luego de la antepenúltima Línea :

Código
  1. // Como dije antes, aunque las variables globales se inicializan a 0 por defecto, es mejor especificarlo para facilitar su lectura
  2. // Normalmente una variable sin inicializar se entiende que se le va a dar un valor concreto mas adelante y que no importa el valor
  3. // que tenga en este momento
  4. int variableGlobal = 0;
  5. const int CONSTANTE_GLOBAL = 0;
  6.  
  7. void func() {
  8.  int variableLocalFunc = 0;
  9.  
  10.  cout << "Variable global: " << variableGlobal << endl; // Como se llama en el main() despues de modificar el valor de variableGlobal -> Mostrara 10
  11. //  cout << "Variable local main: " << variableLocalMain << endl; // ERROR: La variable local de main() no es accesible desde aqui
  12. }
  13.  
  14. int main() {
  15.  // Una variable local no se inicializa a 0 por defecto. Por lo tanto es necesario inicializarla explicitamente (dado el caso)
  16.  // Al igual que antes, se puede dejar sin inicializar si se le va a dar un valor mas adelante (estando seguros de que no se va a usar esta variable antes de darle un valor)
  17.  // Lo de inicializar siempre todas las variables al momento de declararlas ya depende de gustos
  18.  int variableLocalMain = 0;
  19.  
  20.  variableGlobal = 10;
  21.  cout << "Variable global: " << variableGlobal << endl; // Muestra: "Variable global: 10"
  22.  
  23. //  constanteGlobal = 10; // ERROR: Es una constante -> No se puede modificar  = = = = Debo anular la Línea, entiendo que es coherente hacerlo.
  24. //  cout << "Constante global: " << constanteGlobal << endl; // Muestra: "Constante global: 0" = = = No muestra nada : Sólo arroja ERROR al compilar ( ? )
  25.  
  26.  
  27.  // CIERRE DE PROGRAMA :
  28.  // A C L A R A C I Ó N
  29.  // Cerrando así, con " func(); ", CODE devuelve = " variableGlobal = 10 " pues tiene en cuenta tanto los Cuerpos ' int main( ) ' como ' void func( ) '
  30.                                                 // " variableGlobal = 10 "
  31.  // P  E  R  O
  32.  // Si cerrara con " return 0; " , CODE devuelve = " variableGlobal = 10 " pues tiene en cuenta sólo el Cuerpo ' int main( ) '
  33.  
  34.  func(); // X supuesto q para cerrar con " getch (); " se comportará como con " return 0; " pero habrá que ' dar Cabecera de #include <conio.h> '
  35. }
« Última modificación: 17 Diciembre 2021, 06:38 am por snoopty » En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Línea de Código : duda
« Respuesta #7 en: 17 Diciembre 2021, 17:18 pm »

Una más...

Código
  1. int arreglo[ cantidad ];
error C2131: expression did not evaluate to a constant arm64 msvc v19.latest

cantidad no es constante, lo que hace que esta no sea una expresión válida C++.
Es válida en C99, pero no lo es no lo fue nunca en C++.

Se trata de VLA "Variable Length Array" (array de longitud variable). Algunos compiladores lo implementan como una extensión al lenguaje pero otros no, por ejemplo del del Visual Studio...

En línea

snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Línea de Código : duda
« Respuesta #8 en: 18 Diciembre 2021, 02:51 am »

A mí esa línea de código no me arroja error .... quizás te referís a declaración de errores inexactas de algún IDE; Qué IDE usas ? En Codeblocks 20.03 no tuve problemas .... y mirá que es bastante " sensible "
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Línea de Código : duda
« Respuesta #9 en: 18 Diciembre 2021, 07:45 am »

A mí esa línea de código no me arroja error .... quizás te referís a declaración de errores inexactas de algún IDE; Qué IDE usas ? En Codeblocks 20.03 no tuve problemas .... y mirá que es bastante " sensible "


Como ya te explicaron no es C++ standard, igual que conio.h, tenes suerte de que no te de error al compilar.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pasar codigo a una linea « 1 2 3 »
PHP
dimitrix 22 8,933 Último mensaje 28 Junio 2007, 10:52 am
por dimitrix
Duda Leer Linea por Linea de Un textBox
Programación Visual Basic
NsTeam 2 7,814 Último mensaje 1 Diciembre 2010, 02:58 am
por Stelio Kontos
Pasar de una linea de codigo a otro sin perder la secuencia del codigo en vb
Programación Visual Basic
plak 2 2,643 Último mensaje 28 Junio 2014, 03:13 am
por plak
Duda sobre una linea en mi codigo que no funciona
Programación C/C++
miguevv 6 2,784 Último mensaje 11 Agosto 2018, 03:31 am
por miguevv
Duda en una Línea de Codigo
Programación C/C++
snoopty 7 4,439 Último mensaje 6 Diciembre 2021, 08:39 am
por snoopty
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines