﻿# V6011\. The expression contains a suspicious mix of integer and real types\.

Анализатор обнаружил потенциальную ошибку в выражении, где совместно используются целочисленные и real\-типы данных\. Под real\-типами понимаются такие типы, как 'float' и 'double'\.

Давайте посмотрим, как может проявить себя ошибка на практике\.

```cpp
boolean IsInRange(int object_layer_width, int object_layer_height)
{
  return  object_layer_height != 0 &&
          object_layer_width/object_layer_height > 0.1 &&
          object_layer_width/object_layer_height < 10;
}
```

Здесь целочисленное значение сравнивается с константой '0\.1'\. Это очень подозрительно\. Предположим, что переменные имеют следующие значения:

* object\_layer\_width \= 20;
* object\_layer\_height \= 100;

Программист ожидает, что при делении этих чисел результат будет равен '0\.2'\. Это подходящее значение, так оно попадает в диапазон \(0\.1\.\.10\)\.

На самом деле, результат деления будет равен 0\. Деление осуществляется над целочисленными типами данных\. Потом, при сравнении с '0\.1' произойдет расширение до типа 'double', но будет уже поздно\. Чтобы исправить код, необходимо заранее использовать явное приведение типов:

```cpp
boolean IsInRange(int object_layer_width, int object_layer_height)
{
  return  object_layer_height != 0 &&
          (double)object_layer_width/object_layer_height > 0.1 &&
          (double)object_layer_width/object_layer_height < 10;
}
```