надлежащее использование преинкрементного оператора в сочетании с указателем разыменовывает оператор

Я просто записал следующую строку кода:

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 оператор по-другому? Я мог выполнить инкремент сначала, на его собственной строке, и затем протестировать условие для предотвращения любого возможного беспорядка. Действительно ли это необходимо, или действительно ли первые два примера достаточно очевидны самостоятельно?

7
задан e.James 16 December 2009 в 21:49
поделиться

4 ответа

1) Приоритет

2) Предпочтение

11
ответ дан 6 December 2019 в 07:26
поделиться

Да, это вопрос приоритета операторов. Оператор стрелки имеет более высокий приоритет , чем оператор приращения.

Чтобы ответить на ваш второй вопрос, я бы обычно разделил этот тип конструкции на два отдельных утверждения:

++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }

Это подчеркивает, что происходит, и исключает возможную путаницу. Однако, вероятно, это вопрос предпочтений.

5
ответ дан 6 December 2019 в 07:26
поделиться
  1. Приоритет оператора определяет поведение, которое вы наблюдали.
  2. Это не повредит, если вы отделите приращение от сравнения в этом примере, но иногда вы хотите иметь условие с приращением в в середине последовательности условий, а затем попытка отделить приращение от теста может ухудшить читабельность кода из-за введения вложенности, которая в противном случае была бы ненужной.

Например:

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...
}
5
ответ дан 6 December 2019 в 07:26
поделиться
  1. Оператор -> связывает более жестко, чем ++.
  2. Они оба четко определены, и я думаю, что их легко читать. Ситуация усложнится, только если у вас будут дополнительные ссылки на data_ptr в том же выражении.
3
ответ дан 6 December 2019 в 07:26
поделиться
Другие вопросы по тегам:

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