Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .
|
---------->
HTTP request
|
+--------------+ | +--------------+
| | | | |
| browser | | | web server |
| (JavaScript) | | | (PHP etc.) |
| | | | |
+--------------+ | +--------------+
|
client side | server side
|
<----------
HTML, CSS, JavaScript
|
Обе стороны общаются через HTTP-запросы и ответы. PHP выполняется на сервере и выводит код HTML и, возможно, JavaScript, который отправляется как ответ клиенту, где интерпретируется HTML, и выполняется JavaScript. Когда PHP завершит вывод ответа, сценарий закончится, и на сервере ничего не произойдет, пока не появится новый HTTP-запрос.
Пример кода выполняется следующим образом:
Шаг 1, PHP выполняет весь код между тегами . В результате получилось следующее:
Вызов file_put_contents
не привел ни к чему, он просто написал «+ foo +» в файл. Вызов привел к выводу «42», который теперь находится в том месте, где этот код использовался.
Этот итоговый код HTML / JavaScript теперь отправляется клиенту, где он получает оценку , Вызов alert
работает, а переменная foo
нигде не используется.
Весь PHP-код выполняется на сервере до того, как клиент даже начнет выполнение какого-либо JavaScript. В ответе JavaScript, с которым может взаимодействовать JavaScript, нет кода PHP.
Чтобы вызвать некоторый код PHP, клиент должен будет отправить новый HTTP-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:
Вот более подробный изложение этого метода
Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location
или отправить форму, подражая возможностям 1 и 2.
Это невозможно. Пример вашего кода
a, b = b, a;
интерпретируется следующим образом:
a, (b = b), a
Он ничего не делает. Оператор запятой возвращает значение a (самый правый операнд). Поскольку назначение связывается более жестко, b = b находится в parens.
Правильный способ сделать это просто
std::swap(a, b);
Boost включает в себя класс кортежей, с которым вы можете сделать
tie(a, b) = make_tuple(b, a);
. Он внутренне создает кортеж ссылки на a и b, а затем присвоены им кортеж b и a.
Или Perl. Но нет, это невозможно (насколько мне известно), вам нужно использовать временную переменную, как в:
int a = 4;
int b = 5;
{
int tmp = a;
a = b;
b = tmp;
}
FYI, внутренне эти языки (или Perl atleast) создают временную list { a, b }
, затем присвойте список двум переменным. Другими словами, это по крайней мере как исполнитель, если только немного более беспорядочно.
В стандартной библиотеке такой функции нет. Вы можете написать набор функций шаблона:
template <typename T1> void ParAssign(T1& Lhs_1, T1 const& Rhs1);
template <typename T1, typename T2> void ParAssign(T1& Lhs1, T2& Lhs2, T1 const& Rhs1, T2 const& Rhs2);
// etc.
ParAssign(a,b,
b,a);
Это нетривиально, если есть псевдонимы, как в вашем примере подкачки.
Или Lua ... Есть трюки с C / C ++, например, с использованием xor или операций, но с риском переполнения и т. д. Просто делайте это болезненно, с тремя заданиями. Не очень.
Параллельное назначение не поддерживается в C ++. Языки, которые поддерживают это, обычно рассматривают a,b,c
как список по обе стороны оператора присваивания, это не так, как работает оператор запятой на C ++. В C ++ a, b
оценивает a, а затем b, поэтому a, b = b, a
совпадает с a; b = b; a;
.
Этот вопрос очень старый & ndash; Я просто наткнулся на это сегодня ... ... и задался вопросом, почему никто не дал этот ответ раньше ...
Я думаю, это возможно сделать в C ++ 11, как это делает Python (под капюшон):
#include <iostream>
using namespace std;
int main()
{
int a = 4, b = 5;
cout << "Before assignment: a: " << a << ", b: " << b << endl;
pair<int&, int&> ba(b, a);
ba = make_pair(a, b); // <===: (b, a) = (a, b)
cout << "After assignment : a: " << a << ", b: " << b << endl;
return 0;
}
Я попробовал это на ideone.com . Вывод был:
Before assignment: a: 4, b: 5
After assignment : a: 5, b: 4
Если я правильно помню (я не эксперт Python), в Python a, b
обозначает пару. ( Python Doc .: 5.3. Кортежи и последовательности )
Такая пара может быть выполнена на C ++ 11 легко, например. с std::pair
. В этом случае я сделал пару ссылок и назначил пару значений. Он работает, когда make_pair()
загружает обе переменные, прежде чем правая пара (значений) будет назначена левой паре ссылок.
Прокрутка снова, я понимаю, что этот ответ близок к решению, основанному на повышении Йоханнес отвечает .
Может быть, причина в том, что он не работал на C ++ 03. Я пробовал в coliru.stacked-crooked.com: С -std=c++03
он дает ужасное читать ошибки компилятора & ndash; изменяясь на -std=c++11
, и он компилирует и выполняет тонкие, как описано выше.
Отказ от ответственности
Я просто не могу представить, какое это решение подходит, и то, что он может иметь. Это не то, что я пытался сделать. Как и многие другие ответы, «это не работает». ИМХО это делает (правильно написано в соответствии с языком C ++) ...