#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
}
Здесь следует приведенная ниже последовательность:
- Вызывается метод someFunc(), который после выполнения, как ожидается, вернет некоторое целочисленное значение в соответствии с объявленной нашей переменной.
- После того, как значение возвращается из метода, оно сохраняется внутри переменной a .
- Теперь весь оператор, присутствующий внутри круглых скобок, обрабатывается как значение, присутствующее внутри переменной a , т.Е. (a = someFunc()) становится a, которое снова является целочисленным значением, возвращаемым вызовом метода someFunc() .
- Теперь это значение сравнивается с 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.