Вопрос

Почему следующий кусок печати C -кода 12 12 12

int main(int argc, char const *argv[]) {
  int a = 2, *f1, *f2;
  f1 = f2 = &a;
  *f2 += *f2 += a += 2.5;
  printf("%i %i %i\n", a, *f1, *f2);
  return 0;
}
Это было полезно?

Решение

*f2 += *f2 += a += 2.5;

Эта линия имеет Неопределенное поведение Потому что вы меняете ценность *f2(т.е. a) более одного раза в пределах одного и того же выражения без промежуточной последовательности. UB означает, что ваша программа может распечатать «Hello World», она может разбиться, она может распечатать 12 12 12 или же 12 12 1029 Или это может начать есть ваш мозг. Не полагайтесь на неопределенное поведение.

Чтобы процитировать стандарт C ++ (я знаю, что вопрос с меткой C, но у меня нет стандарта C, и я знаю, что то же правило содержится в C)

За исключением случаев, когда отмечено, порядок оценки операндов отдельных операторов и подэкспрессий отдельных выражений и порядок, в котором происходят побочные эффекты, не указан. больше раз по оценке выражения. Кроме того, предварительное значение должно быть доступно только для определения значения, которое будет сохранено. Требования этого параграфа должны быть выполнены для каждого допустимого упорядочения подразделений полного выражения; в противном случае поведение неопределенный.

Другие советы

Он распечатывает одно и то же значение для всех, потому что вы указываете только на один int переменная: a.

Он распечатывает 12 потому что a + 2.5 = 4 (a является int), а затем вы добавляете его к себе дважды.


@DownVoters: Почему так негатив? Я думаю, что мой ответ говорит, что этот компилятор делает на Этот пример кода, что должно помочь ОП понять поведение. я согласна с тем что Армен ЦирунянОтвет правильный (т.е. должен получить тик) и что Поведение не определен в соответствии со стандартом. Анкет Но стандарты реализованы, и я еще не увидел компилятора, который компилирует код, а затем, во время выполнения, внезапно бросает руки и говорит Undefined behaviour!.

Я потому что *f2 а также *f1 указать на a (целое число).

Так *f2 = &a = 2 а также *f1 = &a = 2

На этом этапе вы добавляете к значению 2.5 (потому что a это целое число, вы получите 4).

Чем у вас есть

a = 4
f2 = 4
f1 = 4

На данный момент вы делаете f2+f1+a = 12.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top