В чем разница между назначением между C и Python? [Дубликат]

Ваш код разбит на две полностью отдельные части, серверную сторону и клиентскую сторону .

                    |
               ---------->
              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-запрос на сервер. Это может произойти с использованием одного из трех возможных способов:

  1. Ссылка, которая заставляет браузер загружать новую страницу.
  2. Подача формы, которая передает данные на сервер и загружает новую страницу.
  3. Запрос AJAX , который является техникой Javascript, чтобы сделать обычный HTTP-запрос на сервер (например, 1. и 2. будет), но без оставляя текущую страницу.

Вот более подробный изложение этого метода

Вы также можете использовать JavaScript, чтобы браузер открыл новую страницу с помощью window.location или отправить форму, подражая возможностям 1 и 2.

6
задан Nick 8 November 2008 в 21:14
поделиться

6 ответов

Это невозможно. Пример вашего кода

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.

16
ответ дан Johannes Schaub - litb 24 August 2018 в 23:15
поделиться

Или Perl. Но нет, это невозможно (насколько мне известно), вам нужно использовать временную переменную, как в:

int a = 4;
int b = 5;

{
    int tmp = a;
    a = b;
    b = tmp;
}

FYI, внутренне эти языки (или Perl atleast) создают временную list { a, b }, затем присвойте список двум переменным. Другими словами, это по крайней мере как исполнитель, если только немного более беспорядочно.

1
ответ дан Matthew Scharley 24 August 2018 в 23:15
поделиться

В стандартной библиотеке такой функции нет. Вы можете написать набор функций шаблона:

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);

Это нетривиально, если есть псевдонимы, как в вашем примере подкачки.

0
ответ дан MSalters 24 August 2018 в 23:15
поделиться

Или Lua ... Есть трюки с C / C ++, например, с использованием xor или операций, но с риском переполнения и т. д. Просто делайте это болезненно, с тремя заданиями. Не очень.

0
ответ дан PhiLho 24 August 2018 в 23:15
поделиться
  • 1
    Возможно, вы захотите упомянуть, что xor трюк работает только с интегральными типами. Кроме того, целочисленное продвижение будет препятствовать переполнению, но два из одного и того же типа не будут переполняться операцией xor. 0b1110 xor 0b1010 всегда будет 0b1100, при этом это побитовая операция – Beached 12 October 2017 в 02:56

Параллельное назначение не поддерживается в C ++. Языки, которые поддерживают это, обычно рассматривают a,b,c как список по обе стороны оператора присваивания, это не так, как работает оператор запятой на C ++. В C ++ a, b оценивает a, а затем b, поэтому a, b = b, a совпадает с a; b = b; a;.

3
ответ дан Robert Gamble 24 August 2018 в 23:15
поделиться

Этот вопрос очень старый & 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 ++) ...

0
ответ дан Scheff 24 August 2018 в 23:15
поделиться
Другие вопросы по тегам:

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