Как можно назначить переменную, где выражение необходимо в Java?

#java #python

#java #python

Вопрос:

Я искал разницу между выражением и оператором, и возник вопрос.

В C или java я могу назначить переменную в операторе if следующим образом.

 int a;
// someFunc returns an integer value
if ((a=someFunc()) == 1) {
    // do something
}
  

Напротив, python этого не допускает.

 if (a = someFunc() is 1):
    # do something
  

конечно, после PEP 572, после python 3.8 я могу его использовать,
но должен использовать := symbol.

однако a=someFunc() это не выражение, а оператор, который ничего не возвращает после выполнения. верно?
итак, способ интерпретации кода python выглядит разумным, а java — нет

но как можно интерпретировать этот способ кода на java или C? и почему это разрешено?

Комментарии:

1. 1 Означает true ли это?

2. ну, я не могу понять, что вы имеете в виду. этот код Java будет интерпретироваться как if ( a == 1) , и если a равно 1, то true, если нет, false .

Ответ №1:

Я попытаюсь объяснить это, взяв ваш пример:

 int a;
if((a = someFunc()) == 0) {
    //do something here
}
  

Здесь следует приведенная ниже последовательность:

  1. Вызывается метод someFunc(), который после выполнения, как ожидается, вернет некоторое целочисленное значение в соответствии с объявленной нашей переменной.
  2. После того, как значение возвращается из метода, оно сохраняется внутри переменной a .
  3. Теперь весь оператор, присутствующий внутри круглых скобок, обрабатывается как значение, присутствующее внутри переменной a , т.Е. (a = someFunc()) становится a, которое снова является целочисленным значением, возвращаемым вызовом метода someFunc() .
  4. Теперь это значение сравнивается с 0, и оператор if проверяется соответствующим образом.

Комментарии:

1. спасибо, но все еще не могу понять. вы сказали (a=someFunc()) becomes a . но мне интересно, что » a=someFunc() это оператор, который не является выражением, поэтому он будет использован и ничего не вернет , но как он может оставаться». это тривиальный вопрос, но он меня смущает.

2. давайте разберемся в этом так: в java, когда вы пишете int a = someFunc(); , происходит то, что someFunc() возвращает значение и сохраняется в a . Теперь, когда оператор завершается, конечное значение, которое он дает, — это значение, присутствующее внутри a . И это не ограничивается только инструкцией if, вы также можете попробовать это внутри инструкции print.

3. Например: int a; System.out.println(a = 5); Это выведет 5 в консоль. Итак, что происходит, когда оператор завершается, последнее значение, которое хранится в памяти, на которую ссылается переменная, сохраняется там. Точно так же, когда мы пишем if((a == someFunc()) == 0) so в конце первых круглых скобок, значение, на которое ссылается переменная a , сохраняется в памяти, а затем используется для сравнения его с 0.