Использование! (X-a) вместо x == a в C - PullRequest
0 голосов
/ 10 января 2019

Я пишу программу на C, которая выполняет много сравнений, и мне было интересно, действительно ли это экономит память.

Любая помощь приветствуется

Ответы [ 3 ]

0 голосов
/ 10 января 2019

В зависимости от типов x и a семантика !(x-a) может отличаться от семантики x==a. В зависимости от того, что вы пытаетесь сделать, такие различия могут быть полезными, вредными или неуместными. В тех случаях, когда они полезны, должен быть комментарий, показывающий, как семантика должна отличаться от x==a и почему это важно.

Например, если x и a оба значения с плавающей запятой равны положительной бесконечности, x==a даст 1, но вычисление x-a даст NaN и применение оператора ! к этому приведет к нулю.

Мне неизвестны какие-либо распространенные идиомы, связанные с различиями между x==a и !(a-x), поэтому любой код, использующий последнюю форму без указания причин, следует рассматривать с подозрением.

0 голосов
/ 10 января 2019

!(x-a) вместо x==a

x==a лучше

Как указатели x, a, x==a четко определено. x-a - неопределенное поведение, если только x,a не указывают и не указывают на один и тот же объект.

В качестве целых чисел знака x, a, x==a четко определено. x-a может переполнить диапазон целых чисел со знаком, а затем неопределенное поведение @ Джонатан Леффлер .

Как число с плавающей запятой x, a, x==a четко определено. x-a может иметь неожиданные эффекты @supercat.

Tie

С x в качестве указателя в массиве и a в качестве int, x-a может привести к новому адресу, а !(x-a) равно 0. x==a попытается создать указатель из a, который , если соответствует допустимому указателю, код приводит к 0 или 1.


Код, обеспечивающий наибольшую ясность и оставляющий проблемы микрооптимизации компилятору.

С сравнением это, безусловно, ==.


На теоретическом уровне, скажем, !(x-a) и x==a имели одинаковую функциональность для всех a,x. Если один из них работает быстрее другого, то хороший компилятор будет генерировать код, основанный на более быстром из этих двух.

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

0 голосов
/ 10 января 2019

Нет, это не так. Использование хитрого синтаксиса для создания чего-то, для чего существует хорошо известный синтаксис, никогда не является правильным ответом. Вы должны использовать x == a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...