!(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
. Если один из них работает быстрее другого, то хороший компилятор будет генерировать код, основанный на более быстром из этих двух.
Более слабый компилятор может выиграть, если кодер знает лучше, чем компилятор. Да, верно