Булевая функция без return'a возвращает корректное значение
Работаю в QT 6.2 Есть у меня программа, что считает площадь произвольного простого многоугольника. Перед расчётом площади, я проверяю многоугольник на пересечение сторон.
if(!cross(polygon, n))
{
double S = square(polygon,n);
if(!(qIsInf(S)))
{
ui->l_Sq->setText("Площадь: " + QString::number(S));
}
else
{
warning("Многоугольник слишком большой(");
}
}
else
{
warning("Я умею работать только с простыми многоугольниками(");
}
Для этого я вызываю булевую ф-цию not_cross()
bool cross(double **polygon, int n = 0) // Ф-ция проверки на пересечение сторон многоугольника
{
bool not_cross = true;
double x1,x2,x3,x4;
double y1,y2,y3,y4;
double v1,v2,v3,v4;
for (int i=0; i<n&¬_cross; i++)
{
int k = (i+1)%n;
x1 = polygon[i][0]; x2 = polygon[k][0];
y1 = polygon[i][1]; y2 = polygon[k][1];
for (int j = 0; j<n&¬_cross; j++)
{
int m = (i+j)%n;
int v = (m+1)%n;
if(abs(i-m) <= 1)
continue;
x3 = polygon[m][0]; x4 = polygon[v][0];
y3 = polygon[m][1]; y4 = polygon[v][1];
v1 = (x4-x3)*(y1-y3)-(y4-y3)*(x1-x3);
v2 = (x4-x3)*(y2-y3)-(y4-y3)*(x2-x3);
v3 = (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
v4 = (x2-x1)*(y4-y1)-(y2-y1)*(x4-x1);
not_cross = !((v1*v2<0) && (v3*v4<0)) && not_cross;
}
}
}
Как можно заметить, в этой ф-ции отсутствует return. Однако она всё ещё возвращает корректные значения. Tо есть, если фигура пересекается, то она вернёт true, если не пересекается -- false
Вроде бы, я достаточно раз протестировал работу программы, чтобы исключить совпадения.
С чем это связанно? Неужели компилятор сам догадывается вернуть значение not_cross? Хотя если дописать возращение, то придётся написать return !not_cross
(Да, я тут нагородил кода. Простите, я писал в спешке)
Ответы (1 шт):
Формально, функция без return, которая возвращеет не void, другими словами, функция, выполнение которой доходит до последней скобки, не встречая на своем пути return (что-то), вызывает неопределенное поведение.
Неопределенное поведение может быть и таким, какого вы ожидаете, но программа при этом остается некорректной.