2013-09-11 5 views
0

Пожалуйста, помогите мне, что моя голова готова ударвложенного цикла без фигурных скобок

#include<stdio.h> 
int main(void){ 
    unsigned short sum1=0;unsigned short counter=0; 

    printf("Enter the number of integers you want to sum\n");scanf("%hd",&counter); 
    for (unsigned int i=1;i<=counter;++i) 
    { 
     printf("The i is %d and the sum is %d\n",i,sum1); 
     sum1 =0;// 2 iteration sum =0; 
     printf("The i is %d and the sum is %d\n",i,sum1); 

     for(unsigned int j=1;j<=i;++j) 
      sum1 =sum1+j;// 1 iteration sum=1; 
     printf("The i is %d and the sum is %d\n\n",i,sum1); 
    } 
return 0; 
} 

До сих пор книга, которую я прочитал в вложенных циклов, используемых поставить фигурные скобки Но не в этом примере ... Вопрос 1) Почему во второй итерационной сумме будет 3, а не 2 (я спрашиваю об этом, потому что сумма инициализирует 0 до перехода к вложенным)? Вопрос 2) Почему, когда я хочу напечатать f(), ошибка j попадает в ошибку? Может ли кто-нибудь объяснить мне ТОЧНО, КАК ЭТО ПРОГРАММА РАБОТАЕТ? я имею в виду 1-й итерации, 2-ой итерации .... Спасибо братья ....

+0

@haccks как бы улучшение вашего редактирования делает для структуры кода, я думаю, что это отвлекает от вопроса, который заключается в понимании запутанного блока кода. Переформатируя его, вы устранили большую часть путаницы. – Jordan

+0

@Jordan; Я сделал это для OP. – haccks

+1

@haccks Это прекрасно, я не говорю, если я думаю, что вы делали плохо или что-то в этом роде, но кто-либо другой, приходящий на этот вопрос для помощи, может не понять, о чем этот вопрос действительно был. (Вероятно, это маловероятное событие: P) – Jordan

ответ

3

Этот код:

for (unsigned int i=1;i<=counter;++i) 
{ printf("The i is %d and the sum is %d\n",i,sum1); 
sum1 =0;// 2 iteration sum =0; 
printf("The i is %d and the sum is %d\n",i,sum1); 
for(unsigned int j=1;j<=i;++j) 
sum1 =sum1+j;// 1 iteration sum=1; 
printf("The i is %d and the sum is %d\n\n",i,sum1);} 

эквивалентно:

for (unsigned int i=1;i<=counter;++i) { 
    printf("The i is %d and the sum is %d\n",i,sum1); 
    sum1 =0;// 2 iteration sum =0; 
    printf("The i is %d and the sum is %d\n",i,sum1); 
    for(unsigned int j=1;j<=i;++j) { 
     sum1 =sum1+j;// 1 iteration sum=1; 
    } 
    printf("The i is %d and the sum is %d\n\n",i,sum1); 
} 

Это происходит потому, что в for-loop s без фигурных скобок, в цикле включена только следующая строка.

Теперь в первой итерации, вы получите:

"The i is 1 and the sum is 0" 
"The i is 1 and the sum is 0" 
"The i is 1 and the sum is 1" //Enters inner for-loop 

Второе:

"The i is 2 and the sum is 1" //Hasn't reset yet 
"The i is 2 and the sum is 0" //Reset 
"The i is 2 and the sum is 3" //Sum was 0, then added 1 when j was 1, 
           //then added 2 when j was 2 

Теперь, по этой причине вы не можете напечатать J, потому, что ваши printf заявления все вне ваш внутренний for-loop, поэтому j не определен :)

+0

Нет, это не эквивалентно ... С {} выводит больше результатов ....Я понимаю, что printf() внутри вложенного цикла печатается ТОЛЬКО при i = j; И что вложенное для каждого раза инициализируется !!!! Это правильно? – paulakis

+0

@paulakis I _think_ вы неверно истолковываете, как структуры 'for-loop' работают без брекетов. Я не верю, что есть 'printf()' внутри вложенного цикла вообще. – Jordan

+0

Я понял, почему сумма принимает эти значения (на мой первый вопрос ответили) Я не понимаю, почему j не отображается – paulakis

1

В C вы не можете объявить свои переменные внутри последовательности для цикла:

for(int i=0; i<=10; i++) неправильно
И
int i;
for (i=0; i<=10; i++) правильно

Также вы можете сказать int a,b,c=3; вместо того, чтобы объявить их отдельно int a, int b, int c=3;

Чтобы помочь с вашим вопросом (я хотел бы прокомментировать, но я требуется больше репутации), если в вашем заявлении (для, если, пока) есть только одна (или ни одна) операция, вам не нужны фигурные скобки:
for (i=0; i<=10; i++)
        printf("%i ", i);

При наличии нескольких операций, необходимо фигурную скобку для составителя, чтобы узнать, сколько из них находятся внутри для цикла:

for (i=0; i<=10; i++){
        printf("%i ", i);
        if(i%2==1)
                printf("Odd number");
        printf("\n");
}

Edit:
int i;
for(i=0; i<=10; i++){
        int j = i+5;
        printf("%i", j);
}
Очень хорошо работает, но j не будет доступен за пределами цикла for.

+1

Я знаю, что вы не можете объявлять переменные в циклах, но с помощью этого трюка -std = c99 в компиляторе это работает – paulakis

+0

Возможно, он работает, но может быть лучше не начинать бросать случайные переменные в каждом, а. Если у вас есть более крупный код, это может навредить вам, поскольку вы можете подумать, что переменная должна что-то делать, но не потому, что она находится вне области видимости. –

+0

Кто вам сказал, что переменная не может быть объявлена ​​внутри цикла for? – haccks

Смежные вопросы