Хорошо, я понял это. Проблемы возникли из-за моих разрешений для новой папки для третьего домена. Я не установил правильные разрешения. Выполнение следующих команд устранило мою проблему.
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
Если мы игнорируем силу привычки, «++ i» концептуально является более простой операцией : она просто добавляет единицу к значению i, а затем использует ее.
i++
, с другой стороны, это «принять исходное значение i
, сохранить его как временное, добавить его в i
, а затем вернуть временное». Это требует от нас сохранения старого значения даже после обновления i
.
И, как показал Конрад Рудольф, может быть снижение производительности при использовании i++
с пользовательскими типами.
Итак, вопрос в том, почему не всегда просто значение по умолчанию ++i
?
Если у вас нет причин использовать `i ++ ', зачем это делать? Почему бы вам по умолчанию выполнить операцию, о которой сложнее рассуждать, и может выполняться медленнее?
Как вы заметили - это не имеет значения для результата.
Существует соображение производительности для непримитивных типов.
Кроме того, семантическое использование предварительного инкремента обычно более четко показывает намерение теста при использовании возвращаемого значения, поэтому лучше использовать его обычно, чем постинкрементное, чтобы избежать случайного тестирования старого значения.
Да, по причинам производительности. В случае постинкрементного копирования перед изменением необходимо сделать копию переменной i, чтобы можно было вернуть старое значение (даже если вы не используете возвращаемое значение). В случае предварительного увеличения эта копия не требуется.
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.
Посмотрите на возможные реализации двух операторов в собственном коде:
// Pre-increment
T*& operator ++() {
// Perform increment operation.
return *this;
}
// Post-increment
T operator ++(int) {
T copy = *this;
++*this;
return copy;
}
Постфиксный оператор вызывает префиксный оператор для выполнения своей собственной операции: по дизайну и в принципе префиксная версия всегда будет быстрее, чем постфиксная версия, хотя компилятор может оптимизировать это во многих случаях (и особенно для встроенных типов).
Поэтому предпочтение оператора префикса является естественным; это другое требует объяснения: почему так много людей заинтригованы использованием оператора префикса в ситуациях, когда это не имеет значения - но никого никогда не удивляет использование оператора постфикса.
Есть одна причина, и она связана с перегруженными операторами. В перегруженной функции постинкремента функция должна запомнить предыдущее значение объекта, увеличить его, а затем вернуть предыдущее значение. В функции прединкремента функция может просто увеличивать объект, а затем возвращать ссылку на себя (его новое значение).
В случае целого числа приведенное выше, вероятно, не применимо, потому что компилятор знает контекст, в котором приращение выполняется, и в любом случае будет сгенерирован соответствующий код приращения.
Нет особых причин отдавать предпочтение преинкременту перед постинкрементом, когда вы говорите о естественных типах, таких как целые числа. В любом случае компилятор обычно может сгенерировать один и тот же код в обоих случаях, если вы не используете возвращаемое значение. Это неверно для более сложных типов, таких как итераторы.