Почему приращение не работает в этом случае? - PullRequest
1 голос
/ 05 июля 2019

Этот конкретный цикл заполняет массив, который обозначает двоичное число по битам.Я пытаюсь проверить, что число, введенное пользователем, равно «0» или «1» с помощью троичного оператора.

while (i < 8)
{
    printf("Bit %d: ", i);
    scanf("%d", &binaryNumber[i]);
    ((binaryNumber[i] == 1) || (binaryNumber[i] == 0)) ? i++ : printf("Binary bits can only be 0 or 1!\n"), i--;
}

Этот код не может увеличивать i;таким образом, он зацикливается бесконечно, и printf("Bit %d: ", i) всегда приводит к Bit 0: Небольшой i--, скрытый в углу :, предназначен для повторного доступа к предыдущему элементу и его замены на правильное значение.

Однако, добавив i++ под троичным, он отлично работает.У меня вопрос: почему это не работает в первом случае и почему работает во втором?

1 Ответ

4 голосов
/ 05 июля 2019

Ваше выражение сгруппировано как

(
    binaryNumber[i] == 1 || binaryNumber[i] == 0 
    ? i++ 
    : printf("Binary bits can only be 0 or 1!\n")
), i--;

и компилируется с определенным поведением, поскольку printf возвращает тип int, а , - точка последовательности.Другими словами, i это всегда с уменьшением.

Обратите внимание, что бит между ? и : сгруппирован, как если бы он был в скобках, но это не так длячасть после :.Другими словами, несколько странно, выражение

!(binaryNumber[i] == 1 || binaryNumber[i] == 0) 
? printf("Binary bits can only be 0 or 1!\n"), i--
: i++

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...