2016-10-07 3 views
0

Я смотрю на строковые манипуляции на C, и я не понимаю, почему оператор s1[i] = s1[++i]; не заменит первый H следующим символом e. Посмотрите на код:Почему эта часть кода не меняет строку?

#include <stdio.h> 

main() 
{ 
    char s1[] = "Hello world !"; 
    for(int i = 0; s1[i] != '\0'; ++i) 
    s1[i] = s1[++i]; 
    printf("%s", s1); 
} 

Он печатает Hello world ! вместо el r

+3

Поскольку 's1 [i] = s1 [++ i];' - неопределенное поведение. –

+0

@Phylogenesis oh okay awesome Я думал, что это ++ я имел значение только для s1 [++ i] не для всего утверждения. – ChiseledAbs

+1

Возможный дубликат [Точка последовательности в индексе массива] (http://stackoverflow.com/questions/37403357/sequence-point-in-array-index) –

ответ

4

Ваша программа undefined behaviour, потому что в этом заявлении

s1[i] = s1[++i]; 

i модифицируется дважды между точками последовательности (оператор присваивания = не вводит точку последовательности).

НКУ (gcc -Wall -Wextra) предупреждает с:

warning: operation on ‘i’ may be undefined [-Wsequence-point] 

так же лязг предупреждает:

warning: unsequenced modification and access to 'i' [-Wunsequenced] 
+0

-Wextra не требуется, чтобы получить это предупреждение, но по-прежнему рекомендуется. – jforberg

2
undef.c: In function ‘main’: 
undef.c:7:24: warning: operation on ‘i’ may be undefined [-Wsequence-point] 
      s1[i] = s1[++i]; 
         ^~~ 

Включить ваши предупреждения компилятора и обратить на них внимание. Компилятор - ваш друг.

Что значит это предупреждение:

Там нет правила в C поговорке, которая должна быть оценена сторона задания первой. В этом случае кажется, что правая сторона сначала оценивалась, но в целом результат будет неопределенным.

+0

У меня нет предупреждающего сообщения с 'cc', это странно. – ChiseledAbs

+0

@ChiseledAbs Какой компилятор вы используете? Убедитесь, что вы работаете с флагом -Wall или эквивалентом для своего компилятора (обратитесь к руководству вашего конкретного компилятора). Программирование без предупреждений является опасным и ненужным. – jforberg

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