Пишу: double qqq = 0.5; double ggg = 1/2; В первом случае отладчик показывает 0.5, во втором - НОЛЬ. Кто-то не дружит с головой Пишу: double ggg = 1000*(1-1/2); Полагаю, в ggg должно быть 500, а там по-прежнему 1000! Да что же это такое????
все правильно. Напиши например double ggg = 1/2.0; или double ggg = 1.0/2; Проблема из-за приведения типов. 1 - тип int, 2 - тоже тип int, результат целочисленного деления 1 на 2 = 0 и 0 уже приводится к double. По поводу второго примера - опять-же сделай одно из чисел double добавив ".0" или просто "." после числа.
Можно еще приведение типов сделать: double ggg = (double)(1/2); хотя мне больше нравится double ggg((double)(1/2)); - по-моему красиво и необычно
Я в свое время тоже долго над этим голову ломал ) с тех пор всегда или тип явно привожу при вычислениях с плавающей точкой, а если константа - то обязательно с точкой и 0
Black_mirror Разве ноль? Хмм.. Не помню точно как писать, а с++ под рукой нет.. Ну ход мыслей то верен!
Получается, паскаль лучше в этом случае: var d: double; begin d:=1 div 2; { Получается 0.0 } d:=0.5; { Получается 0.5 } d:=1/2; { Получается 0.5 - верно, на мой взгляд } Т.е. есть целочисленное деление, а есть - вещественное. СИ более высокоуровневый в смысле деления ?
Нет, просто в сях много дефолтов. Например, если он видит цифру, то считает ее интом, если он видит цифру с точкой, то считает ее даблом. Так как я пользуюсь обычно байтом и флоатом, то постоянно приходится делать приведение типов для констант. Но я привык.
n0p Не только в дефолтах но и в порядке выполнения операций. Вот еще одни "грабли" которые долго искал: Код (Text): *pointer_to_some_int_array[i] = SOME_INT_CONST; Как вы думаете куда запишется SOME_INT_CONST?
volodya А если нет дизассемблера для данного типа процессора и платформы? а только С компилятор??? )) Даже отладчик не работал по техническим причинам, а есть только жалкое логирование и снятие логов через интерфейс.... 3 дня искали методом исключения где память всего устройства портится... А процедура компиляции + прошивка + вызов процедуры со снятием лога занимает около часа? ))
DaemoniacaL по моему это путь к #GP... но я не совсем понял, pointer_to_some_int_array это - int any[some_elements]; int** pointer_to_some_int_array = &any; // так? если такъ, то открываем Стива Прату и смотрим в приложении таблицу ассоциативности (вроде так...) операций, исходя из которой следует писать (*pointer_to_some_int_array) = SOME_INT_CONST; если я ничего не напутал, то тут ассоциативность справа налево..... а то *pointer_to_some_int_array = SOME_INT_CONST; компилер может понять как *(*(pointer_to some_int_array+i)) // если я опять не напутал...
Inked Wedge Операция [] находится в первой приоритетной группе, а * - во второй, так что справа налево или слева направо - без разницы. Да, и не может понять, а поймёт обязательно Здесь вобщем-то приоритет достаточно естественный. А вот, скажем, в выражении --*p++ уже всё не так очевидно (декремент содержимого по указателю, после чего инкремент самого указателя).
Artem ага, исходя из чего делаем выводы - если уж дернул черт использовать HLL, то лучше лишний раз все конкретизировать, чем пытацца запомнить все эти подводные камни (это возможно только при довольно длительной практике)...
infern0 говоря "конкретизировать" я имел в виду именно скобки :/, а может ты знаешь другой путь конкретизации выражений в HLL? тогда плз. по подробней DaemoniacaL в "вашей" это в чьей?