2016-09-14 2 views
-4
a=5;b=10;a----------------++++++++++++++++++b 
# Output: 15 

Вышеупомянутый результат скрипта python. Не могли бы вы объяснить, как это работает? Я был очень удивлен, что он работает и дает ответ!Python - Как оценивается следующее выражение?

Однако подобное такое выражение не работает в Java, C, C++ Например:

a=10;  
b=5; 
System.out.println(a---b);//error!! 
cout<<a---b;//error 
printf("%d\n",a---b);//error 

ли это что-то делать с компилятором - лексического анализатора/синтаксического анализатора? Я понимаю, что «самый левый, нетерпеливый и жадный» подход используется компиляторами, но я точно не понимаю, как это работает в этом случае.

+0

, но 'a --- b' работает, и он аналогичен также – SomeJavaGuy

+1

В частности. Java, что бы означать «a-b»? Это означает «a -b»? 'a-- b'? 'a - -b'? Он предположит, что это один из первых двух случаев, и ни один из них не действителен. –

+2

Какой из этих трех других лангаугов вы хотите получить? В C ответ «это синтаксическая ошибка». Или вы задаете вопрос Python? –

ответ

6

В Python, это

a - ---------------++++++++++++++++++b 

что, вычитая из ---------------++++++++++++++++++ba.

Префикс -, отрицание, изменение знака числа, префикс + ничего не делает.
Пример:

>>> -+2 
-2 
>>> +-2 
-2 
>>> --2 
2 

Поскольку существует 15 отрицаний, a - ---------------++++++++++++++++++b эквивалентно a - -b, который является a + b.

Java, C и C++ имеют префикс и постфикс -- и ++ (декремент и инкремент) операторы, и «максимальной правило Мюнх», ваше выражение будет читаться как

(((((((((((((((((a--)--)--)--)--)--)--)--)++)++)++)++)++)++)++)++)++) b 

, которые, даже если те операции на a были законными, было бы столько глупостей, как a b есть.
(Обратите внимание, что a---b справедливо, это означает a-- - b.)

Подробная информация о работах инкремента и декремента можно найти в любой подходящей книге.

+0

Спасибо! Это действительно помогло. –

Смежные вопросы