Большие проекты C++ я видел едва используемый больше чем одно пространство имен (например, стимулируйте библиотеку).
На самом деле повышение использует тонны пространств имен, обычно каждая часть повышения имеет свое собственное пространство имен для внутренних работ и затем может поместить только открытый интерфейс в повышение пространства имен верхнего уровня.
Лично я думаю что, чем больше кодовая база становится, тем более важные пространства имен становятся, даже в рамках отдельного приложения (или библиотека). На работе мы помещаем каждый модуль нашего приложения в его собственном пространстве имен.
Другое использование (никакая предназначенная игра слов) пространств имен, что я использую много, является анонимным пространством имен:
namespace {
const int CONSTANT = 42;
}
Это - в основном то же как:
static const int CONSTANT = 42;
Используя анонимное пространство имен (вместо помех) однако рекомендуемый путь к коду и данным, чтобы быть видимым только в текущей единице компиляции в C++.
Всякий раз, когда у меня возникает путаница с подобными вещами, я сначала извлекаю 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.
$ x
сам по себе также является TERM. Поскольку он встречается первым (в вашем первом примере), он сначала оценивается.
Ассоциативность оператора *
направлена влево, поэтому крайний левый член всегда вычисляется перед крайним правым членом. Другие операторы, такие как **
, являются правоассоциативными и оценили бы ($ x + = 5)
перед остальной частью оператора.
В результате ввода вопроса я получил ответ: условия имеют высший приоритет. Это означает, что $ 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