오류, 버그, 질문 - 페이지 416

 
Yedelkin :

변수가 bool 유형 인 경우 default : return ( false ) 을 지정하는 요점은 무엇이며 기본적으로 둘 다 switch 문에서 사용되는 두 개의 값만 가지고 있습니까? 즉, 기본 레이블은 전혀 실행되지 않아야 합니다.

PS 1. 또한 접근 방식을 따르면 optional의 기본 레이블이 필수가 됩니다.

2. 두 버전 모두에서 break 문은 불필요합니다.

switch 문bool_var 를 정수 유형으로 변환합니다.

그리고 컴파일러는 이 변수에 두 개의 값이 있다는 것을 알 필요가 없습니다. 그는 알고리즘에 대한 논리적 분석을 수행하지 않습니다.

 
Interesting :

한 가지 더 잊어버렸습니다. 모든 변수는 잘못된 값을 가질 수 있거나 초기화되지 않을 수 있습니다(값 "쓰레기" 사용)...

나는 잊지 않았다. 따라서 내 예에서는 변수가 초기화되었습니다. 그럼에도 불구하고 컴파일러에서 오류가 발생했습니다.

bool bool_var=- 1의 예는 매우 올바르지 않습니다. 직접 참조:

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

switch 문bool_var정수 유형 으로 변환합니다.

그리고 컴파일러는 이 변수에 두 개의 값이 있다는 것을 알 필요가 없습니다. 그는 알고리즘에 대한 논리적 분석을 수행하지 않습니다.

그런데 부울을 사용하면 초기화되지 않은 변수나 값이 -1인 변수가 true/false로 변환되는 좋은 옵션이 있습니다.

물론 변수를 int로 명시적으로 선언하면 발생하지 않습니다.

예델킨 :

나는 잊지 않았다. 따라서 내 예에서는 변수가 초기화되었습니다. 그럼에도 불구하고 컴파일러에서 오류가 발생했습니다.

bool bool_var=- 1인 예는 매우 잘못되었습니다. 직접 참조:

이미 확신이 있어서 삭제했습니다. 그러나 이것은 말하자면 임의의 운입니다(언어의 특징으로 간주).

그러나 스위치 블록에서 가능한 오류를 처리할 때 컴파일러는 입력으로 무엇을 어떻게 입력하는지 파악할 필요가 없습니다. 이것이 컴파일러가 이를 경고가 아닌 오류로 간주하는 이유입니다.

 
Dima_S :

그리고 컴파일러는 이 변수에 두 개의 값이 있다는 것을 알 필요가 없습니다. 그는 알고리즘에 대한 논리적 분석을 수행하지 않습니다.

즉 컴파일러가 열거의 값 목록과 총 수를 고려하지 않는다고 말하고 싶습니까?

 
Interesting :

그러나 스위치 블록에서 가능한 오류를 처리할 때 컴파일러는 입력으로 무엇을 어떻게 입력하는지 파악할 필요가 없습니다. 이것이 컴파일러가 이를 경고가 아닌 오류로 간주하는 이유입니다.

중간 결론은 다음과 같습니다. "enumeration+switch" 바인딩을 사용하면 기본 레이블 사용이 필수 가 됩니까?
 
Yedelkin :

1. bool은 어쨌든 "정수 유형"입니다. 또는 스위치에 이전 정수 유형으로의 캐스트가 있다고 말하고 싶습니다.

2. 컴파일러가 열거의 값 목록과 그 총 수를 고려하지 않는다고 말하고 싶습니까?

1. bool은 1바이트의 정수형입니다. 캐스트는 int 로 이동합니다. 맞습니다.

2. 여기에서도 모든 것이 올바르게 작성되었습니다. 유일한 경우는 열거형이 아니라 조건부 분기에 대한 레이블일 뿐입니다.

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

1. bool은 1바이트의 정수형입니다. 캐스트는 int 로 이동합니다. 맞습니다.

핸드북에 따르면 bool은 정수와 다른 특수 유형입니다. 따라서 잘못된 설명을 제거했습니다. 나는 논쟁하지 않을 것이지만 - 특별하지는 않습니다.

디마_S :

예델킨 :

즉 컴파일러가 열거의 값 목록과 총 수를 고려하지 않는다고 말하고 싶습니까?

2. 여기에서도 모든 것이 올바르게 작성되었습니다. 유일한 경우는 열거형이 아니라 조건부 분기에 대한 레이블일 뿐입니다.

케이스 레이블이 아니라 열거(bool 유형을 가장 작은 것으로 간주)를 의미했습니다. 다음은 동일한 컴파일 오류가 있는 예입니다.

 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();
  }

따라서이 예와 관련하여 질문을 반복하겠습니다. 컴파일러가 Triple 열거의 값 목록과 총 수를 고려하지 않는다는 말입니까? switch 문에 사용된 열거형의 모든 값이 있습니다.

[삭제]  
Yedelkin :
중간 결론은 다음과 같습니다. "enumeration+switch" 바인딩을 사용하면 기본 레이블 사용이 필수 가 됩니까?

이 옵션을 상상해 보십시오(그런데 값 3은 값의 명시적 선언과 함께 작동하지 않지만 -1은 쉽게 작동합니다). 그러나 변수의 명시적 초기화가 없으면 값이 인덱스 0을 가진 값과 동일하다는 것을 나타냅니다(여기서 모든 것이 고려됨).

기본 옵션이 제외된 경우 함수는 무엇을 반환해야 합니까?

 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 :
중간 결론은 다음과 같습니다. "enumeration+switch" 바인딩을 사용하면 기본 레이블 사용이 필수 가 됩니까?

예, return()에서 무언가를 반환해야 하는 경우.

또는 적어도 컴파일러가 함수가 무언가를 반환할 것이라고 확신할 수 있도록:

 bool bool_var= false ;
bool Test( void )
  {
   switch (bool_var)
     {
       case    true : return ( true );
       case false : return ( false );
     }
     return ( false ); //хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart ()
  {
   Test();
  }
 
과학에 대해 모두 감사합니다! 마지 못해 추가 라인을 삽입해야합니다 :)