В C#, каково различие между myInt ++ и ++ myInt?

не ответ, но хочу сказать, что, используя PHP 7.2.5 в mod_php с Apache 2.4.33, я не могу воспроизвести вашу проблему, поскольку у меня нет проблем с отправкой чего-либо от 1 байта до 10000 или даже до 100000 байтов в Заголовки:

enter image description here

вот мой продюсер: php:

 не ответ, но хочу сказать, что, используя PHP 7.2.5 в mod_php с Apache 2.4.33, я не могу воспроизвести вашу проблему, поскольку у меня нет проблем с отправкой чего-либо от 1 байта до 10000 или даже до 100000 байтов в Заголовки: 

enter image description here

вот мой продюсер: php:

[110]

и ударил ли я http : //127.0.0.1/producer.php? S = 1 или http://127.0.0.1/producer.php?s=10000 или даже http: //127.0. 0.1 / provider.php? S = 100000 , данные возвращаются без проблем, как вы можете видеть на скриншоте выше. Можете ли вы воспроизвести проблему, используя мой код продюсера:

Кстати, интересно, когда я пробую 1 миллион байт, я получаю эту ошибку из curl:

$ curl -I http://127.0.0.1/producer.php?s=1000000
HTTP/1.1 204 No Content
Date: Wed, 16 Jan 2019 20:11:25 GMT
Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5
X-Powered-By: PHP/7.2.5
X-size: 1000000
curl: (27) Rejected 104960 bytes header (max is 102400)!
GET['s'] ?? 1)); header("X-size: {$size}"); $data=str_repeat("a",$size); header("X-data: {$data}"); http_response_code(204); // 204 NO CONTENT

и ударил ли я http : //127.0.0.1/producer.php? S = 1 или http://127.0.0.1/producer.php?s=10000 или даже http: //127.0. 0.1 / provider.php? S = 100000 , данные возвращаются без проблем, как вы можете видеть на скриншоте выше. Можете ли вы воспроизвести проблему, используя мой код продюсера:

Кстати, интересно, когда я пробую 1 миллион байт, я получаю эту ошибку из curl:

$ curl -I http://127.0.0.1/producer.php?s=1000000
HTTP/1.1 204 No Content
Date: Wed, 16 Jan 2019 20:11:25 GMT
Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5
X-Powered-By: PHP/7.2.5
X-size: 1000000
curl: (27) Rejected 104960 bytes header (max is 102400)!

7
задан James Van Huis 12 January 2009 в 21:58
поделиться

11 ответов

Нет никакого различия при записи самостоятельно (как показано) - в обоих случаях myInt будет увеличен 1.

Но существует различие при использовании его в выражении, например, чем-то вроде этого:

MyFunction(++myInt);
MyFunction(myInt++);

В первом случае myInt увеличен, и новое/увеличенное значение передается MyFunction (). Во втором случае старое значение myInt передается MyFunction () (но myInt все еще увеличен, прежде чем функция вызвана).

Другой пример - это:

int myInt = 1;
int a = ++myInt;
// myInt is incremented by one and then assigned to a.
// Both myInt and a are now 2.
int b = myInt++;
// myInt is assigned to b and then incremented by one.
// b is now 2, myInt is now 3

BTW: как Дон указал в комментарии, те же правила также действительны для декрементных операций, и корректная терминология для этих операций:

++i; // pre-increment
i++; // post-increment
--i; // pre-decrement
i--; // post-decrement

Поскольку Jon Skeet указывает:

Другие показали, где это имеет значение и прокомментировало, что как отдельный оператор не имеет значения.

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

Console.WriteLine("Foo: {0}", foo++);

чем:

Console.WriteLine("Foo: {0}", foo);
foo++; 

... но они очень редки! Последний этих двух образцов делает упорядочивание совершенно прозрачным сразу - первый требует небольшого количества взглядов (к моему плохому мозгу, так или иначе). Думайте об удобочитаемости сначала.

52
ответ дан 6 December 2019 в 04:44
поделиться

Другие показали, где это имеет значение и прокомментировало, что как отдельный оператор не имеет значения.

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

Console.WriteLine("Foo: {0}", foo++);

чем:

Console.WriteLine("Foo: {0}", foo);
foo++;

... но они очень редки! Последний этих двух образцов делает упорядочивание совершенно прозрачным сразу - первый требует небольшого количества взглядов (к моему плохому мозгу, так или иначе). Думайте об удобочитаемости сначала.

11
ответ дан 6 December 2019 в 04:44
поделиться

Это не делает, если это не находится в выражении, т.е.

myInt=1;
x=myInt++;

отличается от:

myInt=1;
x=++myInt;

Первое присваивается 1 к x, потому что присвоение происходит перед инкрементом.

Второе присваивается 2 к x, потому что присвоение происходит после инкремента.

9
ответ дан 6 December 2019 в 04:44
поделиться

В присвоении или выражениях, например

x = ++myInt; // x = myInt + 1
x = myInt++; // x = myInt

Это может также использоваться в выражениях как для циклов или если операторы. Например, возьмите следующее, где ищут, 0, и количество равняется 3.

while(seek++ < count) {
   Console.WriteLine(seek);
}

результаты в выводах 1, 2 и 3, для ищут, и следующее

while(++seek < count) {
   Console.WriteLine(seek);
}

Результаты в 1 и 2 для ищут. Так ++ myInt увеличивает myInt, прежде чем его значение будет оценено, где как myInt ++ увеличен после того, как он оценен.

6
ответ дан 6 December 2019 в 04:44
поделиться

Вот в чем разница, если Вы делаете

int x = 7;
int x2 = x++;

=> x2 is 7 and x is 8

но при выполнении

int x = 7;
int x2 = ++x;

=> x2 is 8 and x is 8
3
ответ дан 6 December 2019 в 04:44
поделиться

myInt ++ (4 инструкции ЦП)

LOAD AX, #myInt // From myInt memory to a CPU register
COPY AX, BX
INCREMENT BX
STORE BX, #myInt
// Use AX register for the value

++ myInt (3 инструкции ЦП)

LOAD AX, #myInt // From myInt memory to a CPU register
INCREMENT AX
STORE AX, #myInt
// Use AX register for the value
4
ответ дан 6 December 2019 в 04:44
поделиться

Префиксный оператор ++ myInt является способом уменьшить строки: увеличьте переменную прежде, чем еще передать его куда-нибудь. Это - также хороший способ уменьшить удобочитаемость, так как это редко.

MyMethod(++myInt); 

по сравнению с.

myInt++; 
MyMethod(myInt);

Мне второе намного легче считать.

3
ответ дан 6 December 2019 в 04:44
поделиться

Это определяет, когда результат для той операции возвращается.

Вот пример от сайта MSDN:

static void Main() 
{
    double x;
    x = 1.5;
    Console.WriteLine(++x);
    x = 1.5;
    Console.WriteLine(x++);
    Console.WriteLine(x);
}

И ouput:

2.5
1.5
2.5
3
ответ дан 6 December 2019 в 04:44
поделиться

++ myInt добавит, что тот к myInt прежде, чем выполнить рассматриваемую строку, myInt ++ сделает это позже.

Примеры:

int myInt;

myInt = 1;
someFunction(++myInt); // Sends 2 as the parameter

myInt = 1;
someFunction(myInt++); // Sends 1 as the parameter
2
ответ дан 6 December 2019 в 04:44
поделиться

Я думаю, что является самым простым понять с точки зрения порядка оценки и модификации.

  • Постфиксный оператор (x ++) оценивает сначала и изменяет в последний раз.
  • Префиксный оператор (++ x) изменяет сначала и оценивает в последний раз.

(порядок операций очевиден во введенном порядке оператора и переменной),

Т.е. при использовании в выражении постфиксный оператор оценивает и использует текущее значение переменной в выражении (оператор возврата или вызов метода) прежде, чем применить оператор. С префиксным оператором это наоборот.

3
ответ дан 6 December 2019 в 04:44
поделиться

Если, например, Вы делаете что-то вроде этого:

int myInt = 5;

Foo(++myInt);

void Foo(int x)
{
   Console.WriteLine(x);
}

Это распечатает 6.

Foo(myInt++);

распечатает 5;

В основном ++ myInt увеличивает ПЕРВОЕ использование переменная СЕКУНДА. myInt ++ является противоположным.

0
ответ дан 6 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

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