2016-08-05 2 views
1

В приведенном ниже коде я не уверен, почему я получаю предупреждение: итерация 5u вызывает неопределенное поведение [-Waggressive-loop-optimizations], когда я комментирую printf (""); в цикле for. Как заявление printf способствует этому предупреждению ?.предупреждение: итерация 5u вызывает неопределенное поведение [-Waggressive-loop-optimizations]

Во-вторых, этот код перейдет в бесконечный цикл. Я знаю, что индекс массива находится вне пределов при входе в цикл while. Но когда я получаю отрицательный результат, цикл должен быть прекращен. Но этого не происходит. Если i- выполняется до ввода цикла while, нет проблемы. Если индекс не связан, я должен просто получить результат от мусора. Но почему бесконечно!

int main (void) 
{ 
    int a[]={4,6,8,2,7}; 
    int i=0; 
    int size = sizeof(a)/sizeof(a[0]); 

    for(i=0;i<size;i++) 
    { 
     // printf(" "); 
    } 
// i--; // doing i-- works fine. 
    while(i>=0) 
    { 
     printf("%d\t",a[i]); 
     i--; 
    } 

    return(0); 

} 
+2

Неопределенное поведение приводит к неопределенному поведению, и все может случиться. –

+5

Когда вы обращаетесь к 'a [5]', все идет поскорее. Каково значение 'i' после цикла' for'? Итак, на первой итерации цикла while, каково его значение? Вот почему компилятор жалуется (и почему 'i -' разрешает проблему). –

+0

Я согласен с вами в случае неопределенного поведения. Но здесь только неопределенное поведение, которое я вижу, - это когда вы печатаете [i] в ​​первый раз внутри цикла while. Но в таком случае мусор печатается, я думаю. for loop используется только для увеличения индекса, и я не вижу никакой проблемы внутри цикла. Почему предупреждение указывает на цикл? – Rajesh

ответ

4

Если индекс выходит за границы, я должен быть просто получить результат нездоровой правильно. Но почему бесконечно!

Когда цикл заканчивается for, значение, если i является 5.

В первой итерации цикла while вы получаете доступ к a[5], что приводит к неопределенному поведению. После этого все может случиться.

Кроме того, петля while ошибочна в другой учетной записи. Если не определено поведение не было использовано в цикле, т будет выполнять петли 6 раз, для значений i равной 5, 4, 3, 2, 1 и 0.

Выполнение i--; перед вводом while Петля фиксирует обе проблемы.

+0

Значит, вы хотите сказать, что если индекс массива выходит из строя, это не только печатное значение нежелательной почты, но и неверное поведение. Но почему предупреждение о компиляции указывает на цикл? Почему предупреждение исчезает, если я просто добавляю только оператор printf() внутри цикла for? Таким образом, поведение компилятора также не определено в дополнение к неопределенному поведению во время выполнения? – Rajesh

+0

@Rajesh, «да» на первый вопрос. У меня нет ответов на другие вопросы. –

0

volatile i помогает избежать этого сообщения об ошибке.

+0

Привет, добро пожаловать на сайт! Не могли бы вы добавить немного объяснения, почему ключевое слово 'volatile' решает эту проблему? – GeorgDangl