LINUX.ORG.RU
Форум — Talks  

Оказывается, я всегда неверно знал порядок сишной арифметики

 , вычитание,


0

5
#include <stdio.h>

int main(void) {
  unsigned x;
  double f;
  x = 100;
  f = -x/10.0;
  printf("%1.6f\n", f);
  return 0;
}

как думаете что выведет эта программа?

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

А правильно вот так:

  f = -(x/10.0);
или так
  f = 0-x/10.0;

Я несколько разочарован данной неконсистентностью оператора вычитания, хотя наверно и понятно откуда так получилось: выражение типа -1.0/2.0 должно считаться в одно действие (деление -1 на 2) а не в два (сначала 1/2 а потом сменить знак), а поведение минуса перед числовым литералом и перед переменной сделали единообразным чтобы от препроцессора дополнительные сюрпризы не обнаруживались.

А вы знали об этом? Или может быть вообще не задумывались? (тут три варианта: знал правильно, знал неправильно, не думал)

★★★★★

Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от yax123

твой лекаси копулятор позволяет сложное выражение записать в одну строку как набор присвоений с простыми бинарными операциями - разделёнными точкой запятой - то что отладка построчна только делает эквивалентным такой способ записи сложного выражения

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

разделёнными точкой запятой

А еще можно всю прогу в одну строку записать, но зачем?

ЗЫ

И да, построчная отладка тут не причем. Там где такой компилятор используется, отладки в принципе нет.

yax123 ★★★★★
()
Последнее исправление: yax123 (всего исправлений: 3)

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

z = -1.0*x/y;

или даже более «хакерски-научно» выглядещее (для старых хакеров и фортранщиков, экономящих на каждом символе исходника):

z = -1.*x/y;

Исторически увидел это в каком-то чужом коде хрен знает, сколько лет назад, и понял, что это полезный приём.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 2)
Ответ на: комментарий от seiken

Ну да, я примерно то же самое и делал, только не учёл что, условно -x*1.0 и -1.0*x могут по-разному вычисляться. То что там деление а не умножение это уже несущественно.

firkax ★★★★★
() автор топика

А вы знали об этом?

Не знал. Приоритет унарного минуса логичен, но в выражении -x/10.0 почему-то минус действительно воспринимается как что-то, применяющееся уже после деления.

Но что интересно, никогда не получал проблем в аналогичных выражениях. Думаю, спасала привычка всегда явно кастовать целые в double в таких смешанных вычислениях.

i-rinat ★★★★★
()
Ответ на: комментарий от yax123

тогда в чём ««проблема»» использовать какой докрученный cpp(си- пре процесоор как диды завистанули) для отображения оригинального сырца разработки в целевой код под целевой компилятор ( в данном случае вышеуказанный cc7a)

т.е. как обычно много обусловленно организацией труда и степенью прикомпильнутости(прикепелостью) разраба под контретную платформу(инструмент)

qulinxao3 ★☆
()
Ответ на: комментарий от yax123

И вообще есть, компиляторы, которые не умеют 2 действия в одной строке.

т.е. спрямляя коммуникацию - речь о том

«что для одних константа для для других переменная»

в последнее время угараю на спектре времени связывания (где парочка(из границы) абсурдные края это суперкомпиляция Турчина - и загуглю ) - два примеры сверхраннего и сверхНикогдаПоФакту позднего получения значения

т.е ориентировацца на сверх практически экономикой обусловленный инструмент для нищих :( - перспектива сверэксплауатация другими

qulinxao3 ★☆
()
Ответ на: комментарий от firkax

1*-x

если ваще выпадать из контекста (который «мы тут обмазываемся Сяшкой и нам любо»)

то это же выражение 1(*-х) которое очевидно в разных натациях в разное

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

в последнее время угараю на спектре времени связывания

Так как нет реакции «яннп», буду просто ставить «фейспалм». Писать только если все понятно с первого прочтения.

Извиняюсь перед всеми за личку.

yax123 ★★★★★
()
Ответ на: комментарий от yax123

предлагаю начать петиции сбор по яннп реакции!

qulinxao3 ★☆
()

А я не только скобки расставляю, а еще и делаю явное приведение типов.

Даже в объявлении переменных.

char symbol = (char)0;

Это избавляет от множества неприятных сюрпризов языка. Разные компиляторы, зараза, еще и по-разному могут делать. Так пусть у компилятора будет точное указание, чтобы выражение вычислялось так, как я хочу, а не как хочет какой-то там разработчик компилятора с флагами компилятора по умолчанию.

Vic ★
()
Последнее исправление: Vic (всего исправлений: 1)
Ответ на: комментарий от yax123

в последнее время угараю на спектре времени связывания

Так вроде с первого прочтения понятно.

Спектр времени связывания (binding). Early vs late binding. Early и late — это времена. Между нимии — спектр (множество промежуточных вариантов).

shdown ★★
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

Так вроде с первого прочтения понятно.

Я рад за вас, за ваш кругозор и прозорливость. Сам я наверно не так умен как того ожидает автор.

Из всего его спича, я понял только это. Хотя в рамках обсуждения, зачем мне эта информация я не смог понять. Не говоря про все остальное.

yax123 ★★★★★
()
Вы не можете добавлять комментарии в эту тему: только для зарегистрированных, score>=50.