Search
Write a publication
Pull to refresh
1
0

User

Send message

"Все этикетки, в которых упоминается слово "чёрный", сообщают ложь." не может быть правдой (противоречит само себе), а значит ложно. Значит другая этикетка с "чёрный" должна сообщать правду (иначе первая этикетка будет правдивой). Значит приз в чёрной коробке (и чёрная коробка врёт). Итого:
СК: правда
ЧК: ложь (приз здесь)
БК: ложь

Может ли начальный вариант компилятор преобразовать не только к:


if (p < regionStart + regionSize)

но, также, и к (нет, ну а вдруг на целевой архитектуре < работает намного медленнее, чем !=):


if (p != regionStart + regionSize)

Ход рассуждений
int in_region(int* p)
{
    return p >= regionStart && p < regionStart + regionSize;
}

можно преобразовать в (как-то так, на C я не пишу):


int in_region(int* p)
{
    if (p == regionStart + regionSize)
        return 0;

    int* x = regionStart;
    while (x < regionStart + regionSize)
    {
        if (x == p)
            return 1;
        else
            ++x;
    }

    UndeffinedBehaviorDestroyTheWorldNotImplementedYet();
}

т.е.:


  • либо p указывает на 1 елемент за пределами массива (возвращаем 0)
  • либо указывает в пределах массива (возвращаем 1)
  • либо указывает в любое другое место и тогда компилятор может делать что угодно, ибо испольовать <, <=, >, >= в этом случае нельзя

ну… поскольку ub в программах не существует, то можно оптимизировать до:


int in_region(int* p)
{
    if (p == regionStart + regionSize)
        return 0;

    return 1;
}

или же:


int in_region(int* p)
{
    return p != regionStart + regionSize;
}

Или я что-то не учёл?

Язык C++ не предоставляет примитивную операцию округления чисел с плавающей точкой.

round

Information

Rating
Does not participate
Location
Брест, Брестская обл., Беларусь
Registered
Activity