Errores, fallos, preguntas - página 416

 
Yedelkin:

Entonces, ¿qué sentido tiene especificar default:return(false ) si la variable pertenece al tipo bool, que en principio sólo tiene dos valores, ambos utilizados en la sentencia switch? En otras palabras, la etiqueta por defecto no debería ejecutarse nunca.

P.D. 1. Además, si seguimos su enfoque, la etiqueta por defecto pasa a ser obligatoria en lugar de opcional.

2. los operadores de ruptura no tienen sentido en ambos casos.

El operador switch convierte su bool_var en un tipo entero.

Y el compilador no tiene que saber que esta variable tiene dos valores. No está analizando el algoritmo lógicamente.

 
Interesting:

Te olvidas de una cosa más: cualquier variable puede tener un valor no válido o no estar inicializada (tener un valor "basura")...

No lo olvido. Así que en mi ejemplo la variable fue inicializada. A pesar de ello, el compilador generó un error.

El ejemplo conbool_var=-1es extremadamente incorrecto. Véalo usted mismo:

bool bool_var=-1;
void OnStart()
  {
   Print("bool_var=",bool_var);
  }   
 
Dima_S:

La sentencia switch convierte su bool_var en un tipo entero.

Y el compilador no necesita saber que esta variable tiene dos valores. No está analizando el algoritmo de forma lógica.

Por cierto, con los booleanos, hay una variante afortunada cuando una variable no inicializada o una variable con valor -1, por ejemplo, será lanzada a verdadero/falso.

Lo cual, por supuesto, no ocurrirá si declaras explícitamente la variable como int.

Yedelkin:

No lo olvido. Por eso se inicializó la variable en mi ejemplo. A pesar de ello, el compilador generó un error.

El ejemplo conbool_var=-1es extremadamente incorrecto. Convéncete:

Ya estoy convencido de ello y por eso lo he quitado. Pero es una suerte accidental (considéralo como una característica del lenguaje).

Pero cuando se maneja un posible error en un bloque de conmutación, el compilador no tiene que averiguar qué y cómo se está introduciendo allí, por lo que el compilador lo trata como un error, no como una advertencia.

 
Dima_S:

Y el compilador no necesita saber que esta variable tiene dos valores. No está haciendo un análisis lógico del algoritmo.

¿Dices entonces que el compilador no tiene en cuenta la lista de valores de la enumeración y su número total?

 
Interesting:

Pero al procesar un posible error en un bloque de conmutación, el compilador no tiene que averiguar qué y cómo se está introduciendo, por lo que lo trata como un error, no como una advertencia.

La conclusión intermedia es la siguiente: el uso de la etiqueta por defecto se convierte en obligatorio cuando se utilizan las enumeraciones+conmutación?
 
Yedelkin:

1. bool ya es un "tipo entero". O estás diciendo que switch es una conversión a un tipo entero superior.

2. ¿Dices que el compilador no tiene en cuenta la lista de valores de enum y su número total?

1. bool es un tipo entero con el tamaño de un byte. La conversión es a tipo int, tienes razón.

2. Aquí también tienes razón. Sólo caso no es una enumeración, sino sólo una etiqueta para la ramificación condicional.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Dima_S:

1. bool es un tipo entero de un byte. La conversión va al tipo int, tienes razón.

Según el Manual, bool es un tipo especial distinto de los enteros... Por eso he borrado mi afirmación incorrecta. Aunque no voy a discutir, no soy un experto.

Dima_S:

Yedelkin:

¿Quieres decir que el compilador no tiene en cuenta la lista de valores de la enumeración y su número total?

2. Aquí también lo has escrito correctamente. El único caso no es una enumeración sino una etiqueta para una rama condicional.

Me refería a las enumeraciones (considerando el tipo bool como el más pequeño), no a las etiquetas de mayúsculas. Aquí hay un ejemplo con el mismo error de compilación:

enum Triple
  {
   err=-1,
   no = 0,
   hay= 1
  };
Triple triple_var=err;
Triple Test(void)
  {
   switch(triple_var)
     {
      case  err: return(err);
      case   no: return(no);
      case  hay: return(hay);
      //default:return(hay);
     }
  }
void OnStart()
  {
   Test();
  }

Así que repito mi pregunta sobre este ejemplo: ¿quieres decir que el compilador no tiene en cuenta la lista de valores de la enumeración Triple y su número total? Tengo todos los valores de la enumeración utilizados en el operador switch.

 
Yedelkin:
La conclusión intermedia es la siguiente: ¿el uso de la etiqueta por defecto es obligatorio cuando se utiliza enumeración+conmutación?

Imaginemos esta forma (por cierto, el valor 3 no funciona con la declaración explícita de un valor, pero el -1 sí). Pero la ausencia de inicialización explícita de la variable mostrará que el valor es igual al de índice 0 (todo esto está bien pensado).

¿Qué debe devolver la función si se excluye la opción por defecto?

ENUM_CHART_MODE ChartMode = -1;

string Test()
  {
   switch(ChartMode)
     {
      case 0: return("Bars"); break;
      case 1: return("CANDLES"); break;
      case 2: return("LINE"); break;      
      default: return("Unknown");
     }
  }
void OnStart()
{
Comment(Test());
}
 
Yedelkin:
La conclusión intermedia es la siguiente: ¿el uso de la etiqueta por defecto es obligatorio cuando se utiliza enumeración+conmutación?

sí, si se necesita devolver algo en return().

o al menos para que el compilador pueda estar seguro de que la función devolverá algo:

bool bool_var=false;
bool Test(void)
  {
   switch(bool_var)
     {
      case  true: return(true);
      case false: return(false);
     }
    return(false);//хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart()
  {
   Test();
  }
 
¡Gracias a todos por la ciencia! Tendré que apretar los dientes para poner líneas adicionales :)
Razón de la queja: