Как действует, когда он не получает команды? - PullRequest
0 голосов
/ 05 июня 2019

Я написал цикл for без каких-либо инструкций (кроме тех, которые в синтаксисе for).Теперь, когда я использую точку с запятой сразу после окончания для скобки, переменная i останавливается на значении 4, как и ожидалось;тогда как, если я не использую точку с запятой, он останавливается на значении 6. Почему?

#include <iostream>

using namespace std;

int main()
{
    int x=0;
    int i;
    for(i=0;i<=3;i++) //if the semicolon is absent here, value of x is 6
                      //if present, value of x is 4, as expected
    x=x+i;
    cout<<"x="<<x;
    return 0;
}

Ответы [ 4 ]

2 голосов
/ 05 июня 2019

С точкой с запятой ваш код фактически совпадает с

int x = 0;
int i;
i = 4;
x = x + i; // x = 0 + 4;

, поскольку цикл for эквивалентен

for (i = 0; i <= 3; i++) { } // sets i to 4

Без точки с запятой:

int x = 0;
int i;
i = 0; x = x + i; // x = 0 + 0;
i = 1; x = x + i; // x = 0 + 1;
i = 2; x = x + i; // x = 1 + 2;
i = 3; x = x + i; // x = 3 + 3;

цикл for эквивалентен:

for (i = 0; i <= 3; i++) { x = x + i; }

Прочитайте хорошую книгу C ++ для начинающих, чтобы узнать больше о синтаксисе языка.

1 голос
/ 05 июня 2019

Я написал цикл for без каких-либо инструкций

Нет, ты не сделал. У него был один, который вы хотели быть после цикла. Цикл for всегда содержит оператор.

Теперь, когда я использую точку с запятой сразу после окончания для скобки, переменная i останавливается на значении 4, как и ожидалось;

; само по себе является утверждением. Так же {}

тогда как, если я не использую точку с запятой, он останавливается на значении 6. Почему?

Поскольку он оценивает x = x + i как тело цикла.

В отличие от некоторых других языков, пробелы не разделяют блоки. Вы можете иметь вводящее в заблуждение отступ. Применение автоформатирования даст вам что-то вроде

int main()
{
    int x=0;
    int i;
    for(i=0;i<=3;i++)
        x=x+i;
    cout<<"x="<<x;
    return 0;
}
1 голос
/ 05 июня 2019

Без точки с запятой ваш код эквивалентен

for(i = 0; i <= 3; i++)
{
    x = x + i;
}

С точкой с запятой это однострочный, а x=x+i никогда не вызывается.

Вот почему в некоторых руководствах по стилю кода вас просят всегда использовать скобки с for.

1 голос
/ 05 июня 2019

Это здесь

for(i=0;i<=3;i++)
x=x+i;

На самом деле это то же самое:

for(i=0;i<=3;i++){
    x=x+i;
}

Для for всегда требуется оператор после него, иначе он не скомпилируется. Чтобы прояснить, что вторая строка является оператором цикла, она часто имеет такой отступ:

for(i=0;i<=3;i++)
    x=x+i;

С точкой с запятой код эквивалентен этому:

for(i=0;i<=3;i++){
    ; // does nothing, a so called "null statement"
}
x=x+i; // always happens once
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...