2015-03-02 14 views
2

Следующая цитата взята из http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-137265.htmlJava оператор присваивания

Не используйте оператор присваивания в месте, где он может быть легко спутать с оператором равенства. Пример:

if (c++ = d++) {  // AVOID! (Java disallows) 
    ... 
} 

должен быть записан в виде

if ((c++ = d++) != 0) { 
    ... 
} 

Я смущен линии

if ((c++ = d++) != 0) { 

Любое пояснение по этому вопросу будет оценена.

ответ

1

В самом начале страницы, которую я вижу -

Эта страница активно не поддерживается. Ссылки в документации могут не работать, и сама информация может быть недействительной. Последняя редакция этого документа была сделана 20 апреля 1999

if ((c++ = d++) != 0) { 
     //logic 
    } 

Синтаксис даже не действует (с помощью Java6). Это дает мне

The left-hand side of an assignment must be a variable 

Вам нужно назначить C++ некоторой переменной.

+0

Это не относится к java 8. Такая же ошибка. Но возьмите '' '' '' '' 'и он отлично работает. – CandiedOrange

0

(c++ = d++) - целочисленное выражение, а не булево выражение. Он оценивает любое целое число c, которому присвоено задание c++ = d++. Следовательно, if (c++ = d++) { является не стартером в java.

Таким образом, сравнение с 0 - это то, что требуется для преобразования целочисленного выражения в boolean.

И я думаю, это само собой разумеется. Код, написанный следующим образом:

if ((c++ = d++) != 0) { 

просто плохое кодирование. Во-первых, внутреннее задание в сравнении. Тогда в нем действуют постфиксные операторы. И внести свой вклад в блок кода, который трудно читать, легко возможности для ошибок, трудно поддерживать и т.д. ... Лучше записать следующим образом:

c = d; 
c++; 
d++; 
if (c == d) { 

Но вы уже знали, что. :)

1

В отличие от других языков, таких как C, скалярные примитивы Java (целые числа и т. Д.) Не могут использоваться в качестве логических элементов. Другими словами, 0 ни в коем случае не является true или false. Только то, что равно0 может быть true или false.

0

Они просто пытаются сказать, что компилятор требует условия оператора if для оценки значения boolean. Если вы знаете, что делаете, и решили поставить фактический код с побочными эффектами в качестве условия, вам необходимо сделать выражение для вычисления значения типа boolean.

В то время как код антишаблона в примере будет работать на языке программирования, как C, где boolean значения фактически целые числа (где ноль false, а не ноль это true), правильный способ сделать это в Java является фактическое сравнение результата с 0.