#1 22.04.10 20:17
Загадка Си(препод сказал подумаь на досуге*))
Кароче не пишу код полностью, но фишка в следующем:
есть интервал 0<x<=2
программа должна устанавливать истинность попадания заданного числа в этот промежуток, но при задании его допустим 2.5 оно попадает как то в него и присваивается значение "истина"...
Так вот внимание вопрос как такое может быть? Если тип переменной double! то есть неявного приведения к int нет! Варианты пишите в топик! Кто не верит может попробовать сам но при этом условие должно быть записано в Си вот так if (0<x<= 2) а не через логическое умножение!
Offline
#3 22.04.10 22:20
Re: Загадка Си(препод сказал подумаь на досуге*))
Неявное приведение типа
Само приведение происходит как во время присваивания значения переменной, так и при операциях сравнения, вычисления выражения. При использовании в выражении несколько различных типов значения одного или нескольких подтипов может быть осуществлено преобразование к более общему типу (супертипу), с большим диапазоном возможных значений.
В языке Си:
Код: с:
double d; // вещественный тип long l; // целый тип int i; // целый тип if (d > i) d = i; if (i > l) l = i; if (d == l) d *= 2;
Каждый раз при выполнени операции сравнения или присваивания переменные разных типов будут приведены к единому типу. Следует с осторожностью использовать неявное приведение типа. При переводе числа из вещественного типа в целочисленный, дробная часть откидывается. Обратное приведение из целочисленного типа к вещественному также может привести к понижению точности, что связано с различным представлением вещественных и целочисленных чисел на машинном уровне. К примеру, вещественный тип single стандарта IEEE 754 не может точно представить число 16777217, в то время как 32-битный целочисленный тип может. Это может привести к ситуациям, когда сравнение на равенство одного и того же числа, представленного типами (int и single) будет выдавать ложный результат (числа не равны друг другу).
Offline
#6 23.04.10 00:21
Re: Загадка Си(препод сказал подумаь на досуге*))
Код::
#include <iostream.h>
void main()
{
int key;
double a;
cout<<"Ââåäèòå à"<<endl;
cin>>a;
if (1<a<=2)
{
key = 1;
cout<<"1 < "<<a<<" < 2"<<" "<<key;
}
else
{
key=0;
cout<<"1 < "<<a<<" < =2"<<key;
}
}Так вот если там задать строгое равенство, то там все нормально! Почему так происходит?
Offline
#7 23.04.10 10:40
Re: Загадка Си(препод сказал подумаь на досуге*))
Ну открою секрет - в Си есть действительно косяки(явные неопределенности и непонятности)
Yaha_KoD написал(а):
Так вот если там задать строгое равенство, то там все нормально! Почему так происходит?
А вот тут неправда ваша. Потому что от изменения знака неравенства с <= на < ничего не меняется
$up написал(а):
int k = (1<a);
будет также рано 1, что все-равно меньше 2-х
Offline

