Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > синтаксис С (double)(unsigned int)d == d |
Автор: Killer_13 3.5.2009, 00:27 | ||
Вот такая строчка. где "d" - число типа "double". Я думаю, что это приведение переменной "d" из типа double в тип unsigned int и потом а что потом...... :( |
Автор: fry 3.5.2009, 00:50 |
Возможно автор строк имел в виду округление числа путем приведения его к целому, а затем обратно к числу с двойной точностью (чтобы сравнить его с числом этого же типа). В конце концов эта строка имеет цель выяснить имеет ли число d дробную часть. Попробуй проверить концепцию, самому не охото. |
Автор: Killer_13 3.5.2009, 01:53 |
Хмм, ну типо понятно, а где я могу почитать о таком синтаксисе? :( Читал о приведении типов в разных книгах, - такого не встречал. Вот, да и придется рассказывать, че к чему, а я толком и не понимаю. :( |
Автор: gosn1ck 3.5.2009, 11:11 | ||||
строчка выдернута из условия? я бы согласился с fry, но результат равенства будет непредсказуем |
Автор: zim22 3.5.2009, 11:41 | ||||
почему не предсказуем? я думаю, что результат всегда будет true. т.к. переменная в С/С++ является синонимом адреса или смещения, а не "меткой" объекта. следовательно независимо от того, в каком порядке будут вычислены аргументы оператора ==, сам оператор == отработает в последнюю очередь (т.е. тогда, когда преобразования над d будут завершены. а значит, левая и правая часть operator== будет указывать на одно и тоже значение. *** =хотя код доказывает, что я думаю неправильно ![]()
скорей всего компилятор создаёт временную переменную и поэтому их значения различны.
|
Автор: math64 3.5.2009, 12:21 |
Только это не проверка на целостность. Если d < 0 || d > (double)(unsinged int)(-1), результат будет false, даже если d - целое. Правильно будет d == floor(x) |
Автор: Killer_13 3.5.2009, 12:38 | ||
да, это проверка на "unsigned int", с которым я уже наверное недели 2 парюсь. :( А почему решил задать почти повторно вопрос, да потому, что при проверке , например несколько цифр и букв, это проходит проверку и пишет "что "введенное в строке число". полностью выглядит это так. В предыдущей моей теме так подсказали, но я решил разбирать все до мелочей, так как многого не понимаю. Вот и прошу помощи у вас. пасибо.
|
Автор: math64 3.5.2009, 13:43 | ||
|
Автор: gosn1ck 3.5.2009, 13:48 |
а почему нельзя было бы условие поменять на if (0 <= d && d <= UINT_MAX && d == floor(d)) как говорили вы выше?) |
Автор: Killer_13 3.5.2009, 13:56 |
math64 - вы я смотрю серьезный человек. ![]() ![]() Я просто хочу разобраться, если я к примеру впихну в свою задачку ваш код и понесу показывать преподу, че он по вашему подумает? ![]() ![]() ![]() ![]() Спасибо, попробую с floor Добавлено через 4 минуты и 12 секунд Хмм, а почему например проскакивает "34,2" или "356ds" - "иф" пропускает, - и в конце выдает что эти числа типа "unsigned int" |
Автор: math64 3.5.2009, 14:17 | ||
Мой код сочетает два варианта 1. Ручной разбор числа (USE_DOUBLE не определён) 2. Использование double. Но пользователь может ввести 1.0, это не unsigned int, а твоя программа ответит "да". Поэтому в любом случае нужно вводить строку и проверять, что введены только цифры. Преподавателю нужно нести один вариант, в котором #ifdef убран Добавлено через 3 минуты и 27 секунд
scanf() сканирует только число, всё что за ним оставляет в потоке. И использует английскую нотацию с десятичной точкой, а не запятой, как в России и Германии. |
Автор: gosn1ck 3.5.2009, 14:56 | ||
а что собственно было не понятно с самого начала? Порядок применения унарный операций и операции присваивания "справа налево", а всех остальных "слева направо" (Страуструп 80 - 81 страницы) другое дело что операции выполнялись не так как хотелось бы ![]() |
Автор: Killer_13 3.5.2009, 15:05 |
Мне непонятен был синтаксис. Я просто нигде не встречал такого синтаксиса. :( |
Автор: Killer_13 3.5.2009, 15:38 |
Может кто подсказать, почему от максимального значения типа всегда минусуется единица? тоисить например максимальное значение 4 294 967 296, а вводить можно 4 294 967 295? Спасибо. |
Автор: zim22 3.5.2009, 17:09 | ||
потому что "ноль" тоже число. |
Автор: Killer_13 3.5.2009, 18:51 |
Спасибо. |
Автор: math64 4.5.2009, 08:31 | ||
4 294 967 296 = 0x1uLL << 32 = 0x100000000uLL; в unsigned long не влезет, нужно unsigned __int64. 4 294 967 295 = (unsigned long)(0x1uLL << 32) = 0xFFFFFFFFuL; - как раз макисмальное unsigned long Диапазон для long: Минимум (long)(-(0x1uL << 31)) = (long)0x80000000L; Максимум (long)((0x1uL << 31)-1) = (long)0x7FFFFFFFL; Отрицательных чисел на одно больше |