Смущен насчет scanf () в C? - PullRequest
       1

Смущен насчет scanf () в C?

0 голосов
/ 21 августа 2011

Я увидел этот код в C и запустил его:

int i,j;
scanf("%d %d"+scanf("%d %d",&i,&j));
printf("%d %d",i,j);

Введите:

1 2 3

Выход:

3 2

Это довольно неожиданно (обратный порядок и три входа).

Пожалуйста, объясните это.

Ответы [ 2 ]

6 голосов
/ 21 августа 2011

Это:

scanf("%d %d"+scanf("%d %d",&i,&j));

Ужасный код! Но что происходит?

Сначала вызывается внутренний scanf. Он сохраняет 1 и 2 в i и j соответственно (должно быть понятно, почему это так). Затем он возвращает 2, потому что это количество вещей, которые он сохранил. Затем он «пропускает» первые два символа оператора формата внешнего scanf, делая его " %d". Затем scanf хочет сохранить 3 из входных данных где-нибудь, но во внешнем вызове scanf не было указано указателя на переменную. Так что же будет дальше? Это неопределенное поведение, но фактический факт заключается в том, что второй (внешний) вызов scanf просто повторно использует (или топает, если хотите) аргументы, передаваемые первому (внутреннему) scanf. Итак, 3 хранится в i, и все.

1 голос
/ 21 августа 2011

Ваш код не имеет смысла.

Вы добавляете возвращаемое значение внутреннего scanf к адресу строки, переданной внешнему scanf.Так как scanf возвращает количество введенных элементов, это приводит к добавлению 2 к адресу, в результате чего получается строка, которая начинается двумя байтами (символами) позже.

Внутренний scanf будет выполняться первым.
Затем будет запущен внешний scanf с более короткой строкой формата.

...