Я просто записал следующую строку кода:
if (++(data_ptr->count) > threshold) { /*...*/ } // example 1
Мое намерение состоит в том, чтобы увеличить count
переменная в структуре данных это data_ptr
точки к прежде, чем сделать сравнение с threshold
, и эта строка работ кода.
Если я вместо этого хотел увеличить data_ptr
прежде, чем сделать сравнение, я записал бы это:
if ((++data_ptr)->count > threshold) { /*...*/ } // example 2
Из любопытства я также попробовал эту строку кода:
if (++data_ptr->count > threshold) { /*...*/ } // example 3
И найденный, что это ведет себя точно то же как первое.
Первый вопрос: Почему пример № 3 работает то же примером № 1? Действительно ли это - вопрос оператора precendence? Что-то в стандарте? Я должен был записать, что быстрая тестовая программа becuase ответ не была очевидна для меня.
Второй вопрос: Если я пишу это if
оператор по-другому? Я мог выполнить инкремент сначала, на его собственной строке, и затем протестировать условие для предотвращения любого возможного беспорядка. Действительно ли это необходимо, или действительно ли первые два примера достаточно очевидны самостоятельно?
Да, это вопрос приоритета операторов. Оператор стрелки имеет более высокий приоритет , чем оператор приращения.
Чтобы ответить на ваш второй вопрос, я бы обычно разделил этот тип конструкции на два отдельных утверждения:
++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }
Это подчеркивает, что происходит, и исключает возможную путаницу. Однако, вероятно, это вопрос предпочтений.
Например:
if (...1...)
...2...
else if (++data_ptr->count > threshold)
...3...
else
...4...
Versus:
if (...1...)
...2...
else
{
++data_ptr->count;
if (data_ptr->count > threshold)
...3...
else
...4...
}