Оперативная коммутативность для неравенства! = В C ++ - PullRequest
1 голос
/ 27 июля 2010

У меня быстрый вопрос по поводу следующего выражения:

int a_variable = 0;
if(0!=a_variable)
   a_variable=1;

В чем разница между "(0 != a_variable)" и "(a_variable != 0)"?У меня пока нет ошибок, но это неправильный способ его использования ??

Ответы [ 3 ]

2 голосов
/ 27 июля 2010

если вы забудете !, первое выдаст ошибку (0 = a_variable), а второе нанесет ущерб (a_variable = 0).

Кроме того, с помощью пользовательских операторов вторая форма может быть реализована с помощью функции-члена, тогда как первая может быть только функцией, не являющейся членом (возможно, другом). И возможно, хотя ДЕЙСТВИТЕЛЬНО плохая идея, определить две формы по-разному. Конечно, поскольку a_variable является int, то в этом примере не действуют действующие пользовательские операторы.

0 голосов
/ 27 июля 2010

Любое отличие, которое он может внести, - это порядок, в котором будут оцениваться аргументы. a != b обычно оценивает a, затем оценивает b и сравнивает их, в то время как b != a делает это наоборот. Однако где-то я слышал, что порядок оценки в некоторых случаях не определен.

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

Рассмотрим

int x = 1;
int f() {
  x = -1;
  return x;
}
int g() {
  return x;
}

Если предположить, что операнды вычисляются слева направо, то при вызове (f() != g()) будет получено false, поскольку f() будет равно -1, а g() - -1 - тогда как (g() != f()) даст true, потому что g() будет оцениваться до 1 и f() - до -1.

Это всего лишь пример - лучше не писать такой код в реальной жизни!

0 голосов
/ 27 июля 2010

Нет разницы между 0 != x и x != 0.

...