Как Perl решает который порядок оценить условия в выражении?

Большие проекты C++ я видел едва используемый больше чем одно пространство имен (например, стимулируйте библиотеку).

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

Лично я думаю что, чем больше кодовая база становится, тем более важные пространства имен становятся, даже в рамках отдельного приложения (или библиотека). На работе мы помещаем каждый модуль нашего приложения в его собственном пространстве имен.

Другое использование (никакая предназначенная игра слов) пространств имен, что я использую много, является анонимным пространством имен:

namespace {
  const int CONSTANT = 42;
}

Это - в основном то же как:

static const int CONSTANT = 42;

Используя анонимное пространство имен (вместо помех) однако рекомендуемый путь к коду и данным, чтобы быть видимым только в текущей единице компиляции в C++.

5
задан brian d foy 6 November 2009 в 18:39
поделиться

4 ответа

Всякий раз, когда у меня возникает путаница с подобными вещами, я сначала извлекаю perldoc perlop , а затем, если я все еще не уверен или хочу посмотреть, как конкретный блок код будет выполнен, я использую B :: Deparse :

perl -MO=Deparse,-p,-q,-sC
my $x = 1;
$x = $x * 5 * ($x += 5);

^ D

дает:

(my $x = 1);
($x = (($x * 5) * ($x += 5)));
- syntax OK

Таким образом, замена значений на каждом этапе дает:

($x = (($x * 5) * ($x += 5)));
($x = ((1 * 5) * ($x += 5)));
($x = ((5) * (6))); # and side-effect: $x is now 6
($x = (5 * 6));
($x = (30));
($x = 30);
$x = 30;

Таким образом, тот факт, что $ x был временно установка в 6 на самом деле ни на что не влияет, потому что предыдущее значение (1) уже было подставлено в выражение, а к концу выражения теперь оно равно 30.

9
ответ дан 18 December 2019 в 05:40
поделиться

$ x сам по себе также является TERM. Поскольку он встречается первым (в вашем первом примере), он сначала оценивается.

4
ответ дан 18 December 2019 в 05:40
поделиться

Ассоциативность оператора * направлена ​​влево, поэтому крайний левый член всегда вычисляется перед крайним правым членом. Другие операторы, такие как ** , являются правоассоциативными и оценили бы ($ x + = 5) перед остальной частью оператора.

2
ответ дан 18 December 2019 в 05:40
поделиться

В результате ввода вопроса я получил ответ: условия имеют высший приоритет. Это означает, что $ x в первом фрагменте кода оценивается и дает 1 , затем 5 оценивается и дает 5 , затем ($ x + = 5) вычисляется и дает 6 (с побочным эффектом установки $ x на 6 ) :

$x = $x * 5 * ($x += 5);
address of $x = $x * 5 * ($x += 5); #evaluate $x as an lvalue
address of $x = 1 * 5 * ($x += 5);  #evaluate $x as an rvalue
address of $x = 1 * 5 * ($x += 5);  #evaluate 5
address of $x = 1 * 5 * 6;          #evaluate ($x += 5), $x is now 6
address of $x = 1 * 5 * 6;          #evaluate 1 * 5
address of $x = 5 * 6;              #evaluate 1 * 5
address of $x = 30;                 #evaluate 5 * 6
30;                                 #evaluate address of $x = 30

Аналогично, второй пример сокращается следующим образом:

$x = ($x += 5) * $x * 5; 
address of $x = ($x += 5) * $x * 5; #evaluate $x as an lvalue
address of $x = 6 * $x * 5;         #evaluate ($x += 5), $x is now 6
address of $x = 6 * 6 * 5;          #evaluate $x as an rvalue
address of $x = 6 * 6 * 5;          #evaluate 5
address of $x = 36 * 5;             #evaluate 6 * 6
address of $x = 180;                #evaluate 36 * 5
180;                                #evaluate $x = 180
16
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: