Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
В чем разница между ++i и i++?
В C, в чем разница между использованием ++i и i++, и что следует использовать в блоке инкрементации цикла for ?
++i увеличит значение i, а затем вернет увеличенное значение.
i = 1;
j = ++i;
(i is 2, j is 2)
i++ увеличит значение i, но вернет исходное значение, которое i удерживалось до увеличения.
i = 1;
j = i++;
(i is 2, j is 1)
++i увеличит значение i, а затем вернет увеличенное значение.
i = 1;
j = ++i;
(i is 2, j is 2)
i++ увеличит значение i, но вернет исходное значение, которое i удерживалось до увеличения.
i = 1;
j = i++;
(i is 2, j is 1)
Для цикла for работает либо то, либо другое. ++i кажется более распространенным, возможно, потому, что именно это используется в K&R .
В любом случае, следуйте рекомендациям "предпочитайте ++i вместо i++", и вы не ошибетесь.
Есть несколько замечаний относительно эффективности ++i и i++ . В любом компиляторе non-student-project разницы в производительности не будет. Вы можете проверить это, посмотрев на сгенерированный код, который будет идентичен.
Интересен вопрос эффективности... вот моя попытка ответить на этот вопрос: Есть ли разница в производительности между i++ и ++i в C?
Как и в Заметках Фрейнда , для объекта C++ все по-другому, поскольку operator++() -это функция, и компилятор не может знать, как оптимизировать создание временного объекта для хранения промежуточного значения.
i++ известен как Post Increment , тогда как ++i называется Pre Increment.
i++
i++ -это post increment, поскольку он увеличивает значение i на 1 после завершения операции.
Давайте рассмотрим следующий пример:
int i = 1, j;
j = i++;
Здесь значение j = 1 , но i = 2 . Здесь значение i будет присвоено сначала j , а затем i будет увеличено.
++i
++i -это предварительное приращение, поскольку оно увеличивает значение i на 1 Перед операцией.
Это означает, что j = i; будет выполняться после i++ .
Давайте рассмотрим следующий пример:
int i = 1, j;
j = ++i;
Здесь значение j = 2 но i = 2 . Здесь значение i будет присвоено j после приращения i к i .
Точно так же ++i будет выполняться перед j=i; .
Для вашего вопроса, который должен использоваться в блоке инкрементации цикла for? ответ заключается в том, что вы можете использовать любой из них.. но это не имеет значения. Он будет выполнять ваш цикл for же нет. раз.
for(i=0; i<5; i++)
printf("%d ",i);
И
for(i=0; i<5; ++i)
printf("%d ",i);
Оба цикла будут производить одинаковый выход. то есть 0 1 2 3 4 .
Важно только, где вы его используете.
for(i = 0; i<5;)
printf("%d ",++i);
В этом случае выход будет равен 1 2 3 4 5 .
i++ :- в этом сценарии сначала присваивается значение, а затем происходит инкремент.
++i :- в этом сценарии сначала выполняется приращение, а затем присваивается значение
Ниже приведена визуализация изображения, а также здесь есть хорошее практическое видео ( http://www.youtube.com/watch?v=lrtcfgbUXm4), что демонстрирует то же самое.
Причина, по которой ++i может быть немного быстрее, чем i++ , заключается в том, что i++ может потребовать локальную копию значения i, Прежде чем оно будет увеличено, в то время как ++i никогда этого не делает. В некоторых случаях некоторые компиляторы будут оптимизировать его, если это возможно... но это не всегда возможно, и не все компиляторы делают это.
Я стараюсь не слишком полагаться на оптимизацию компиляторов, поэтому я бы последовал совету Райана Фокса: когда я могу использовать оба варианта, я использую ++i .
Эффективный результат использования любого из них идентичен. Другими словами, цикл будет делать то же самое точно в обоих случаях.
С точки зрения эффективности, может быть штраф, связанный с выбором i++ вместо ++i. с точки зрения спецификации языка, использование оператора post-increment должно создавать дополнительную копию значения, на которое действует оператор. Это может быть источником дополнительных операций.
Однако вы должны рассмотреть две основные проблемы с предыдущей логикой.
Современные компиляторы-это здорово. Все хорошие компиляторы достаточно умны, чтобы понять, что он видит целочисленное приращение в цикле for, и он оптимизирует оба метода для одного и того же эффективного кода. Если использование post-increment вместо pre-increment на самом деле приводит к тому, что ваша программа работает медленнее, то вы используете ужасный компилятор.
С точки зрения трудоемкости операции эти два метода (даже если копия действительно выполняется) эквивалентны. Количество инструкций, выполняемых внутри цикла, должно значительно превышать количество операций в операции инкремента. Таким образом, в любом цикле значительного размера штраф метода инкремента будет массово затенен выполнением тела цикла. Другими словами, вам гораздо лучше беспокоиться об оптимизации кода в цикле, а не о приращении.
На мой взгляд, весь вопрос просто сводится к стилевому предпочтению. Если вы считаете, что pre-increment более удобочитаем, то используйте его. Лично я предпочитаю пост-инкремент, но это, вероятно, потому, что это было то, чему меня учили до того, как я узнал что-либо об оптимизации.
Это типичный пример преждевременной оптимизации, и подобные проблемы могут отвлечь нас от серьезных проблем в дизайне. Однако это все еще хороший вопрос, потому что в "best practice." нет единообразия в использовании или консенсуса
Они оба увеличивают число. ++i эквивалентно i = i + 1.
i++ и ++i очень похожи, но не совсем одно и то же. Оба увеличивают число, но ++i увеличивает число до вычисления текущего выражения, тогда как i++ увеличивает число после вычисления выражения.
Пример :
int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3
++i (операция префикса): увеличивает и затем присваивает значение
(например): int i = 5 , int b = ++i
В этом случае 6 присваивается сначала b, а затем увеличивается до 7 и так далее.
i++ (Постфиксная операция): присваивает и затем увеличивает значение
(например): int i = 5 , int b = i++
В этом случае 5 сначала присваивается b, а затем увеличивается до 6 и так далее.
В случае цикла for : Я++ является в основном используется, потому что обычно мы используем начальное значение i до увеличения в для петли. Но в зависимости от логики вашей программы она может меняться.
Я предполагаю, что теперь вы понимаете разницу в семантике (хотя, честно говоря, мне интересно, почему люди задают вопросы "Что означает оператор X" о переполнении стека, а не о чтении, ну, знаете, книга или веб-учебник или что-то еще.
Но в любом случае, что касается того, какой из них использовать, игнорируйте вопросы производительности, которые являются вряд ли это важно даже в C++. Именно этот принцип вы должны использовать при принятии решения что использовать:
Скажите, что вы имеете в виду в коде.
Если вы не нуждаетесь в value-before-increment в своем операторе, не используйте эту форму оператора. Это незначительная проблема, но если вы не работаете с руководством по стилю, которое запрещает один версия в пользу другого вообще (он же костоголовый стиль руководства), вы должны использовать форма, которая наиболее точно выражает то, что вы пытаетесь сделать.
QED, используйте предварительную инкрементную версию:
for (int i = 0; i != X; ++i) ...
Разницу можно понять с помощью этого простого кода C++ ниже:
int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;
i++ и ++i
Этот небольшой код может помочь визуализировать разницу под другим углом зрения, чем уже опубликованные ответы:
int i = 10, j = 10;
printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);
printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);
Результат таков:
//Remember that the values are i = 10, and j = 10
i is 10
i++ is 10 //Assigns (print out), then increments
i is 11
j is 10
++j is 11 //Increments, then assigns (print out)
j is 11
Обратите внимание на ситуации " до " и "после".
цикл for
Что касается того, какой из них следует использовать в блоке инкрементации цикла for, я думаю, что лучшее, что мы можем сделать для принятия решения, - это использовать хороший пример:
int i, j;
for (i = 0; i <= 3; i++)
printf (" > iteration #%i", i);
printf ("\n");
for (j = 0; j <= 3; ++j)
printf (" > iteration #%i", j);
Результат таков:
> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3
Я не знаю, как вы, но я не вижу никакой разницы в его использовании, по крайней мере, в цикле for.
Вкратце : ++i и i++ работают одинаково, если вы не пишете их в функции. Если вы используете что-то вроде функции(i++) или функции(++i), вы можете увидеть разницу.
функция (++i) говорит сначала приращение i на 1, после чего помещает это i в функцию с новым значением.
функция (i++) говорит, что сначала нужно поместить i в функцию, а затем увеличить i на 1.
int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now
Pre-crement означает приращение на одной и той же линии. Пост-инкремент означает инкремент после выполнения строки.
int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.
int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes
Когда он поставляется с операторами OR, AND, он становится более интересным.
int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}
int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}
в массиве
System.out.println("In Array");
int[] a = { 55, 11, 15, 20, 25 } ;
int ii, jj, kk = 1, mm;
ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
System.out.println(a[1]); //12
jj = a[1]++; //12
System.out.println(a[1]); //a[1] = 13
mm = a[1];//13
System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13
for (int val: a) {
System.out.print(" " +val); //55, 13, 15, 20, 25
}
В C++ post/pre-increment переменной указателя
#include <iostream>
using namespace std;
int main() {
int x=10;
int* p = &x;
std::cout<<"address = "<<p<<"\n"; //prints address of x
std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
std::cout<<"address = "<<&x<<"\n"; //prints address of x
std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}
Единственное различие - это порядок операций между приращением переменной и значением, которое возвращает оператор.
Этот код и его выходные данные объясняют разницу:
#include<stdio.h>
int main(int argc, char* argv[])
{
unsigned int i=0, a;
a = i++;
printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
i=0;
a = ++i;
printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}
Выход есть:
i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1
Таким образом, в основном ++i возвращает значение после его увеличения, в то время как ++i возвращает значение до его увеличения. В конце концов, в обоих случаях значение i будет увеличено.
Еще пример:
#include<stdio.h>
int main ()
int i=0;
int a = i++*2;
printf("i=0, i++*2=%d\n", a);
i=0;
a = ++i * 2;
printf("i=0, ++i*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
return 0;
}
Выход:
i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2
Много раз нет никакой разницы
Различия очевидны, когда возвращаемое значение присваивается другой переменной или когда инкремент выполняется в конкатенации с другими операциями, где применяется приоритет операций ( i++*2 отличается от ++i*2 , но (i++)*2 и (++i)*2 возвращают одно и то же значение), во многих случаях они взаимозаменяемы. Классическим примером является синтаксис цикла for:
for(int i=0; i<10; i++)
имеет такой же эффект от
for(int i=0; i<10; ++i)
Правило, которое надо запомнить
Чтобы не было никакой путаницы между двумя операторами я принял это правило:
Свяжите положение оператора ++ относительно переменной i с порядком выполнения операции ++ относительно присвоения
Сказано другими словами:
++передiозначает, что перед назначением необходимо выполнить инкрементацию;++послеiозначает, что инкрементация должна быть выполнена после присвоения:
Вот пример, чтобы понять разницу
int i=10;
printf("%d %d",i++,++i);
вывод: 10 12/11 11 (в зависимости от порядка вычисления аргументов для функции printf , который варьируется в разных компиляторах и архитектурах)
Объяснение:
i++ - > i печатается, а затем увеличивается. (Печатает 10, но i станет 11)
++i - > i увеличивает значение и выводит его на печать. (Печатает 12, и значение i также 12)