Почему использование ++ я вместо меня ++ в случаях, где значение не используется больше нигде в операторе?

Хорошо, я понял это. Проблемы возникли из-за моих разрешений для новой папки для третьего домена. Я не установил правильные разрешения. Выполнение следующих команд устранило мою проблему.

sudo chown apache:apache -R /var/www/html/example.com/

cd /var/www/html/example.com/
find . -type f -exec sudo chmod 0644 {} \;
find . -type d -exec sudo chmod 0755 {} \;
sudo chcon -t httpd_sys_content_t /var/www/html/example.com -R
sudo chcon -t httpd_sys_rw_content_t /var/www/html/example.com -R

Затем перезапустите Apache ...

sudo systemctl restart httpd.service
25
задан tshepang 21 April 2014 в 21:11
поделиться

7 ответов

Если мы игнорируем силу привычки, «++ i» концептуально является более простой операцией : она просто добавляет единицу к значению i, а затем использует ее.

i++, с другой стороны, это «принять исходное значение i, сохранить его как временное, добавить его в i, а затем вернуть временное». Это требует от нас сохранения старого значения даже после обновления i.

И, как показал Конрад Рудольф, может быть снижение производительности при использовании i++ с пользовательскими типами.

Итак, вопрос в том, почему не всегда просто значение по умолчанию ++i?

Если у вас нет причин использовать `i ++ ', зачем это делать? Почему бы вам по умолчанию выполнить операцию, о которой сложнее рассуждать, и может выполняться медленнее?

31
ответ дан jalf 28 November 2019 в 17:47
поделиться

Как вы заметили - это не имеет значения для результата.

Существует соображение производительности для непримитивных типов.

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

7
ответ дан Timothy Pratley 28 November 2019 в 17:47
поделиться

Да, по причинам производительности. В случае постинкрементного копирования перед изменением необходимо сделать копию переменной i, чтобы можно было вернуть старое значение (даже если вы не используете возвращаемое значение). В случае предварительного увеличения эта копия не требуется.

2
ответ дан Naveen 28 November 2019 в 17:47
поделиться

C ++ FAQ Lite имеет хорошее обсуждение i++ против ++i здесь:

[13.15] Что более эффективно: i ++ или ++ i ?

В частности, в отношении того, какую форму использовать в цикле for, FAQ выражает предпочтение ++i. Вот текст:

Итак, если вы пишете i++ как выражение, а не как часть более крупного выражения, почему бы просто не написать ++i вместо этого? Вы никогда ничего не теряете, а иногда что-то получаете. Программисты старой линии C привыкли писать i++ вместо ++i. Например, они скажут, for (i = 0; i <10; i++) .... Поскольку здесь используется i++ как выражение, а не как часть более крупного выражения, вы можете вместо этого использовать ++i. Для симметрии я лично поддерживаю этот стиль, даже если он не улучшает скорость, например, для внутренних типов и для типов классов с постфиксными операторами, которые возвращают void.

0
ответ дан DavidRR 28 November 2019 в 17:47
поделиться

Посмотрите на возможные реализации двух операторов в собственном коде:

// Pre-increment
T*& operator ++() {
    // Perform increment operation.
    return *this;
}

// Post-increment
T operator ++(int) {
    T copy = *this;
    ++*this;
    return copy;
}

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

Поэтому предпочтение оператора префикса является естественным; это другое требует объяснения: почему так много людей заинтригованы использованием оператора префикса в ситуациях, когда это не имеет значения - но никого никогда не удивляет использование оператора постфикса.

44
ответ дан 28 November 2019 в 17:47
поделиться

Есть одна причина, и она связана с перегруженными операторами. В перегруженной функции постинкремента функция должна запомнить предыдущее значение объекта, увеличить его, а затем вернуть предыдущее значение. В функции прединкремента функция может просто увеличивать объект, а затем возвращать ссылку на себя (его новое значение).

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

4
ответ дан 28 November 2019 в 17:47
поделиться

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

1
ответ дан 28 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

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