Как увеличить оператор post-fix более чем по умолчанию? (Т. Е. Применить оператор post-fix к 4, чтобы он увеличивал значение до 6 вместо 5)
Этот вопрос относится к циклу for, который я хочу создать, где я должен проверять каждое второе число заданной строки для проверки. Я думал, что приращение переменной я на два вместо одного позволит достичь этого.
Вы не можете перегружать оператор ++ для встроенных типов, нет. Самый простой способ - использовать
var += step;
а также
for(i=0; i<end; i+=4) {
...
}
Обратите внимание, что использование меньше, чем вместо равенства приводит вас к тому, чтобы не подчеркивать, что конечная точка не выстраивается точно. Конечно, всегда есть
for(i=0; i<end; ++i) {
do_something(4*i);
}
где число итераций более четкое, если не диапазон, как предыдущий. Что бы ни было лучше для вас.
var += step
не постфикс; он возвращает новое значение.
Вы можете сделать так:
for(int i = 0; i < n; i += x){ /* do something */ }
Я не знаю, почему вы настаиваете на postfix. Для простого for
цикла, префикс эквивалентно, так что предпочитает это, потому что постфикс означает копию. Во всяком случае, помимо очевидных
for(i=0; i<end; i+=n) ...
если вы только увеличиваете на 2, вы также можете сказать
for(i=0; i<end; ++++i) ...
или
for(i=0; i<end; ++i, ++i) ...
но какой из них более эффективен, зависит от оптимизатора (скорее всего, они все те же).
(§1.9/15) The value computations of the operands of an operator are sequenced before the value computation of the result of the operator.
а затем приводит пример ++++i ; //well defined behaviour
. ++++i
разбираюсь как ++(++i)
. Во всяком случае, я с удовольствием удалю его, если увижу, почему он не определен. На данный момент я добавляю ++i, ++i
что (я надеюсь) безопаснее.
Оператор приращения post-fix не работает на шаг, отличный от 1. Выражение obj += 2
возвращает новое значение, а не старое.
Если obj является классом, вы можете взломать свою операционную перегрузку +=
чтобы вернуть старое значение, но это была бы плохая идея.
Мы можем сделать простую функцию шаблона, называемую postinc
которая делает это для нас типовым способом:
#include <iostream>
template <typename OBJ, typename DELTA>
OBJ postinc(OBJ &obj, const DELTA &delta)
{
OBJ oldval = obj;
obj += delta;
return oldval;
}
using std::cout;
using std::endl;
int main()
{
int x = 39;
int y = postinc(x, 3); // <-- now we can do this
// x and 3 can be any objects supporting x += 3
cout << "x = " << x << "; y = " << y << endl;
return 0;
}
Вывод:
x = 42; y = 39
Как вы можете видеть, y
получило старое значение x
, а x
увеличилось на 2
.
Все, что мы сделали, было y = postinc(x, 2)
. Это не причудливый синтаксический сахар, как пост-инкрементная перегрузка y += 2
, но он выполняет сильную работу в выражении, устраняя неуклюжий разрыв кода для введения временных переменных.
Если вам не нужна семантика постфикса или даже значение результата выражения вообще, просто используйте var += delta
.
C
илиC++
? Всегда ли приращение будет 2? Естьvar += 2;
не достаточно?