Побочный эффект оператора C и точка последовательности - PullRequest
2 голосов
/ 28 апреля 2011

Снова привет всем экспертам, и я снова наталкиваюсь на несколько вопросов.

История:

Я читаю книгу, в которой упоминается точка последовательности, котораяis ; - это точка, в которой весь побочный эффект, прежде чем он должен быть оценен, прежде чем перейти к следующему утверждению. Чтобы очистить контекст моего вопроса, я напишу простой код.

Код:

while (guess++ < 10)
{
   printf("%d \n" , guests);

Мое мышление и вопрос:

1.) Из приведенного выше кода, условие теста оператора whileguess++ < 10 - это полное выражение. Так что, на мой взгляд, это не утверждение, потому что оно не заканчивается на ;.

2.) Поскольку используется оператор приращения постфикса, следовательно, guess значение оценивается до его увеличения.

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

4.)Суть в том, что, поскольку условие проверки не заканчивается на ;, следовательно, это не утверждение.Но почему операция приращения, реализованная до вызова функции printf(), а не только после функции print(), только увеличивается? ??

5.) Может быть, это побочный вопрос, в книге упоминается, что while - это структурированное утверждение, но почему я не вижу заключительного ;, добавляемого к нему while(testcondition);.

6.) Это может звучать глупо, но иногда, когда я читаю некоторыеИсходный код, написанный другими, я буду видеть, как некоторые из них помещают открытые скобки { цикла while в ту же строку с while(), что приводит к тому, что это похоже на while(testcondition){.Это соглашение или есть какая-то особая причина для этого ??

Спасибо, что потратили время на чтение моих проблем, ваша помощь очень ценится.

1 Ответ

3 голосов
/ 28 апреля 2011

Ответ на вопрос 1: Код в скобках цикла while на самом деле является полным выражением. Из Википедии :

Эта категория включает в себя операторы выражений (такие как присваивание a = b;), операторы return, управляющие выражения операторов if, switch, while или do-while и все три выражения в операторе for.

Хорошее описание полного выражения можно найти в C faq:

полное выражение Полное выражение, которое формирует оператор выражения или одно из управляющих выражений оператора if, switch, while, for или do / while, или выражения в инициализаторе или операторе return. Полное выражение не является частью большего выражения. (См. ANSI, раздел 3.6 или ISO, раздел 6.6.)

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

Итак, давайте немного углубимся в это. Исправляя ваш фрагмент кода, я придумал следующее:

#include <stdio.h>
int main(void)
{
    unsigned guess = 0;
    while (guess++ < 10)
    {
       printf("%d " , guess);
    }
    return 0;
}

, который производит этот вывод:

1 2 3 4 5 6 7 8 9 10

Таким образом, это означает, что оценка будет эквивалентна следующему коду:

while (guess < 10)
{
    guess++;
    printf("%d " , guess);
}

Ответ на вопрос 5 можно найти в следующем вопросе: В C / C ++ почему делает do while (выражение); нужна точка с запятой?

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