Это можно сделать по разному. Но, все же, какой из нижеперечисленных способов получше с точки зрения читабельности и эффективности? Можете перечислить еще пару способов?
int i{10}, n{};
// четное ли число?..
cout << boolalpha;
cout << ++n << ". " << !(i % 2) << endl //true
<< ++n << ". " << (i % 2 == 0) << endl //true
<< ++n << ". " << (~i & 1) << endl //1
<< ++n << ". " << !(i & 1) << endl //true
<< ++n << ". " << ((i & 1) == 0) << endl; //true
И необязательный вопрос: почему в третьем варианте выводится 1 а не true?
При оптимизации все это будет считаться одинаково, а при известном при компиляции i - и вовсе во время компиляции.
И даже при неизвестном при компиляции i будет считаться только один раз - по крайней мере, VC++ именно так и делает, понимая, что все это - записи одного и того же выражения :)
Например, вот такой код
n += !(i % 2);
n += (i % 2 == 0);
n += (~i & 1);
n += !(i & 1);
n += ((i & 1) == 0);
свелся к
not eax
and eax, 1
lea edx, DWORD PTR [rax+rax*4]
Т.е. вычислили один раз через not и and, и умножили на 5 :)
Необязательный ответ - в третьем случае это значение типа int, а в остальных - типа bool...
Каждый программер делает на свой вкус. Вот, пожалуйста :
# include <iostream>
using namespace std ;
template<class T>
static inline bool oddp(T x){return x bitand 1;}
// и для читаемости
template<class T>
static inline bool nechetn(T x){return x bitand 1;}
template<class T>
static inline bool evenp(T x){return not ( x bitand 1 ) ; }
// и для читаемости
template<class T>
static inline bool chetn(T x){return not ( x bitand 1 ) ; }
int main(){
int i{10}, n{};
// четное ли число?..
cout << boolalpha;
cout << ++n << ". " << !(i % 2) << endl //true
<< ++n << ". " << (i % 2 == 0) << endl //true
<< ++n << ". " << (~i & 1) << endl //1
<< ++n << ". " << !(i & 1) << endl //true
<< ++n << ". " << ((i & 1) == 0) << endl //true
<< ++n << ". " << nechetn(i) << endl
<< ++n << ". " << chetn(i) << endl;
}
и читаемо , и эффективно.
Продвижение своими сайтами как стратегия роста и независимости