Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> синтаксис С (double)(unsigned int)d == d, может в двух словах кто написать 
V
    Опции темы
Killer_13
Дата 3.5.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Код

(double)(unsigned int)d == d

Вот такая строчка.
где "d" - число типа "double".
Я думаю, что это приведение переменной "d" из типа double в тип unsigned int и потом а что потом...... :(
PM MAIL   Вверх
fry
Дата 3.5.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 4.10.2006

Репутация: 2
Всего: 3



Возможно автор строк имел в виду округление числа путем приведения его к целому, а затем обратно к числу с двойной точностью (чтобы сравнить его с числом этого же типа). В конце концов эта строка имеет цель выяснить имеет ли число d дробную часть. Попробуй проверить концепцию, самому не охото.
PM MAIL   Вверх
Killer_13
Дата 3.5.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Хмм, ну типо понятно, а где я могу почитать о таком синтаксисе? :( Читал о приведении типов в разных книгах, - такого не встречал.
Вот, да и придется рассказывать, че к чему, а я толком и не понимаю. :( 
PM MAIL   Вверх
gosn1ck
Дата 3.5.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



Цитата(Killer_13 @ 3.5.2009,  00:27)
Код

(double)(unsigned int)d == d

Вот такая строчка.
где "d" - число типа "double".
Я думаю, что это приведение переменной "d" из типа double в тип unsigned int и потом а что потом...... :(

строчка выдернута из условия?
я бы согласился с fry, но результат равенства будет непредсказуем
PM MAIL ICQ   Вверх
zim22
Дата 3.5.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(gosn1ck @  3.5.2009,  11:11 Найти цитируемый пост)
но результат равенства будет непредсказуем

почему не предсказуем? я думаю, что результат всегда будет true.
т.к. переменная в С/С++ является синонимом адреса или смещения, а не "меткой" объекта.
следовательно независимо от того, в каком порядке будут вычислены аргументы оператора ==, сам оператор == отработает в последнюю очередь (т.е. тогда, когда преобразования над d будут завершены. а значит, левая и правая часть operator== будет указывать на одно и тоже значение.
***
=хотя код доказывает, что я думаю неправильно smile
Код

double x = 5.33;
if ((double)(unsigned int)x == x) { // внутрь блока if не заходит
  double d  = 10;
}


скорей всего компилятор создаёт временную переменную и поэтому их значения различны.
Код

double x = 5.33;
double temp =  (double)(unsigned int)x;
if (temp == x) { // внутрь блока if не заходит
  double d  = 10;
}


Это сообщение отредактировал(а) zim22 - 3.5.2009, 11:49


--------------------
PM MAIL   Вверх
math64
Дата 3.5.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Только это не проверка на целостность.
Если d < 0 || d > (double)(unsinged int)(-1), результат будет false, даже если d - целое.
Правильно будет d == floor(x)
PM   Вверх
Killer_13
Дата 3.5.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



да, это проверка на "unsigned int", с которым я уже наверное недели 2 парюсь. :(
А почему решил задать почти повторно вопрос, да потому, что при проверке , например несколько цифр и букв, это проходит проверку и пишет "что "введенное в строке число".
полностью выглядит это так. В предыдущей моей теме так подсказали, но я решил разбирать все до мелочей, так как многого не понимаю. Вот и прошу помощи у вас. пасибо.
Код

double d;
printf("\nZahl\n->");
scanf ("%lf", &d);
if (0 <= d && d <= UINT_MAX && (double)(unsigned int)d == d) // ob Zahl "d" Ganze Zahl ist
printf("\nUnsigned int");  // это unsigned int
else
printf("\nNICHT Unsigned int");

PM MAIL   Вверх
math64
Дата 3.5.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Код

char line[80];
int i, len;
#ifdef USE_DOUBLE
double d;
#else
unsigned int u;
#endif
bool isUnsigendInt = true;
printf("\nZahl\n->");
gets(line);
len = strlen(line);
#ifndef USE_DOUBLE
u = 0;
#endif
for (i = 0; i < len; i++) {
  char c = line[i]
  if (c < '0' || c > '9') {
    isUnsignedInt = false;
    break;
  }
#ifndef USE_DOUBLE
  if (u > UINT_MAX / 10 || u == UINT_MAX / 10 && c > '0' + UINT_MAX % 10) {
    isUnsignedInt = false;
    break;
  }
  u = u * 10 + c - '0';
#endif
}
#ifdef USE_DOUBLE
if (isUnsignedInt) {
  sscanf (line, "%lf", &d);
  if (d < 0 || d > UINT_MAX || (double)(unsigned int)d != d) 
    isUnsignedInt = false;
}
#endif
if (isUnsignedInt)
  printf("\nUnsigned int");  // это unsigned int
else
  printf("\nNICHT Unsigned int");

PM   Вверх
gosn1ck
Дата 3.5.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



а почему нельзя было бы условие поменять на if (0 <= d && d <= UINT_MAX && d == floor(d)) как говорили вы выше?)
PM MAIL ICQ   Вверх
math64
Дата 3.5.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Тут ошибка: если нечего не ввели, то будет ответ 'да',
а если были пробелы до или после то 'нет'.
но думаю ты сам это исправишь

Добавлено через 1 минуту и 6 секунд
Цитата(gosn1ck @  3.5.2009,  13:48 Найти цитируемый пост)
а почему нельзя было бы условие поменять на if (0 <= d && d <= UINT_MAX && d == floor(d)) как говорили вы выше?)

Можно
PM   Вверх
Killer_13
Дата 3.5.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



math64 - вы я смотрю серьезный человек. smile Мне еще далеко до такого программирования, мне просто нужно делать и учиться простому. smile
Я просто хочу разобраться, если я к примеру впихну в свою задачку ваш код и понесу показывать преподу, че он по вашему подумает? smilesmilesmilesmile
Спасибо, попробую с floor

Добавлено через 4 минуты и 12 секунд


Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"
PM MAIL   Вверх
math64
Дата 3.5.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Мой код сочетает два варианта 
1. Ручной разбор числа (USE_DOUBLE не определён)
2. Использование double. Но пользователь может ввести 1.0, это не unsigned int, а твоя программа ответит "да". Поэтому в любом случае нужно вводить строку и проверять, что введены только цифры.
Преподавателю нужно нести один вариант, в котором #ifdef убран

Добавлено через 3 минуты и 27 секунд
Цитата(Killer_13 @  3.5.2009,  13:56 Найти цитируемый пост)
Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"

scanf() сканирует только число, всё что за ним оставляет в потоке. И использует английскую нотацию с десятичной точкой, а не запятой, как в России и Германии.
PM   Вверх
gosn1ck
Дата 3.5.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 18.4.2009

Репутация: 1
Всего: 1



Цитата(Killer_13 @ 3.5.2009,  13:56)
math64 - вы я смотрю серьезный человек. smile Мне еще далеко до такого программирования, мне просто нужно делать и учиться простому. smile
Я просто хочу разобраться, если я к примеру впихну в свою задачку ваш код и понесу показывать преподу, че он по вашему подумает? smilesmilesmilesmile
Спасибо, попробую с floor

Добавлено @ 14:00


Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int"

а что собственно было не понятно с самого начала? 
Порядок применения унарный операций  и операции присваивания "справа налево", а всех остальных "слева направо" (Страуструп  80 - 81 страницы) другое дело что операции выполнялись не так как хотелось бы smile 
PM MAIL ICQ   Вверх
Killer_13
Дата 3.5.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Мне непонятен был синтаксис. Я просто нигде не встречал такого синтаксиса. :(
PM MAIL   Вверх
Killer_13
Дата 3.5.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Может кто подсказать, почему от максимального значения типа всегда минусуется единица?
тоисить например максимальное значение 4 294 967 296, а вводить можно 4 294 967 295?
Спасибо.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.