Увеличение оператора после исправления более чем на один

0

Как увеличить оператор post-fix более чем по умолчанию? (Т. Е. Применить оператор post-fix к 4, чтобы он увеличивал значение до 6 вместо 5)

Этот вопрос относится к циклу for, который я хочу создать, где я должен проверять каждое второе число заданной строки для проверки. Я думал, что приращение переменной я на два вместо одного позволит достичь этого.

  • 2
    Это вопрос C или C++ ? Всегда ли приращение будет 2? Есть var += 2; не достаточно?
  • 1
    Как ни странно, C ++ позволяет вам это делать, но я уверен, что не рекомендовал бы это.
Показать ещё 5 комментариев
Теги:

4 ответа

3
Лучший ответ

Вы не можете перегружать оператор ++ для встроенных типов, нет. Самый простой способ - использовать

var += step;

а также

for(i=0; i<end; i+=4) {
    ...
}

Обратите внимание, что использование меньше, чем вместо равенства приводит вас к тому, чтобы не подчеркивать, что конечная точка не выстраивается точно. Конечно, всегда есть

for(i=0; i<end; ++i) {
    do_something(4*i);
}

где число итераций более четкое, если не диапазон, как предыдущий. Что бы ни было лучше для вас.

  • 0
    var += step не постфикс; он возвращает новое значение.
  • 1
    @Kaz значение третьего выражения не используется, неважно, до или после него.
Показать ещё 2 комментария
3

Вы можете сделать так:

for(int i = 0; i < n; i += x){ /* do something */ }
  • 0
    да, это сделало бы это, спасибо!
1

Я не знаю, почему вы настаиваете на postfix. Для простого for цикла, префикс эквивалентно, так что предпочитает это, потому что постфикс означает копию. Во всяком случае, помимо очевидных

for(i=0; i<end; i+=n) ...

если вы только увеличиваете на 2, вы также можете сказать

for(i=0; i<end; ++++i) ...

или

for(i=0; i<end; ++i, ++i) ...

но какой из них более эффективен, зависит от оптимизатора (скорее всего, они все те же).

  • 2
    Второй не определен - stackoverflow.com/questions/4176328/… .
  • 0
    @CommanderCorianderSalamander Извините, я не понимаю почему. Один ответ кавычки (§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 что (я надеюсь) безопаснее.
Показать ещё 1 комментарий
0

Оператор приращения 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню