Официальный сайт студ.городка НГТУ
Программирование и БД » Загадка Си(препод сказал подумаь на досуге*)) 

#1  22.04.10 20:17

Загадка Си(препод сказал подумаь на досуге*))

Кароче не пишу код полностью, но фишка в следующем:
есть интервал 0<x<=2
программа должна устанавливать истинность попадания заданного числа в этот промежуток, но при задании его допустим 2.5 оно попадает как то в него и присваивается значение "истина"...
Так вот внимание вопрос как такое может быть? Если тип переменной double! то есть неявного приведения к int нет! Варианты пишите в топик! Кто не верит может попробовать сам но при этом условие должно быть записано в Си вот так  if (0<x<= 2)  а не через логическое умножение!

Offline

#2  22.04.10 20:31

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

#3  22.04.10 22:20

$up
Профиль

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

#4  22.04.10 22:29

$up
Профиль

Re: Загадка Си(препод сказал подумаь на досуге*))

if (1<a<=2)
{
}

можно записать

int k = (1<a);
if (k<=2)
{
}

если a = 2.5
k будет равно 1

1 <= 2 истинно.

Offline

#5  23.04.10 00:05

Re: Загадка Си(препод сказал подумаь на досуге*))

Хм..... Нифига себе ) А   я то думал уже косяк в Си какой то... Мне это напомнило мою прогу с кубическим уравнением! Там тоже неявное приведение было!

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

#8  25.04.10 16:42

Я
Профиль

Re: Загадка Си(препод сказал подумаь на досуге*))

Детский сад. Си не создан для решения неравенств.

Offline

Программирование и БД » Загадка Си(препод сказал подумаь на досуге*)) 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.032 сек.
Выполнено 14 запросов.