@Narts

Почему код именно так работает?

Имеется код:
char *_itoa(int i) {
	static char buf[2];
	buf[0] = i + '0';
	buf[1] = '\0';
	return buf;
}

int main() {

	printf("%s + %s = %s", _itoa(2), _itoa(2), itoa(4));
	_getch();
}


, который выводит 2 + 2 = 2

1. если выводить printf("%s + %s = %s", _itoa(5), _itoa(2), itoa(4)), то будет выводится 5 + 5 = 5
2. если выводить printf("%s + %s = %s", _itoa(10), _itoa(2), itoa(4)), то будет выводится : + : = :
3. если выводить printf("%s + %s = %s", _itoa(2), _itoa(10), itoa(10)), то будет выводится 2 + 2 = 2

Почему код именно так работает?

Символы повторяются из-за static?
Почему во втором примере выводится не 10 + 10 = 10, а : + : = :? Из-за + '0'? Тогда что дает это сложение?
  • Вопрос задан
  • 76 просмотров
Решения вопроса 2
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Потому что '0' - это совсем не нуль. Это ASCII-символ нуля с кодом 0x30. Поэтому сложив 10 (0xA) и '0' (0x30) Вы закономерно получили 0x3A :) Что является ASCII-кодом ':'

Есть замечательный отладчик gdb, который может показывать изменение переменной в процессе работы программы и которым настоятельно рекомендуется пользоваться в спорных моментах. Вот например данная ситуация решается им в течение пары минут :)
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Символы повторяются из-за static?

Не из-за static, а из-за того, что _itoa всегда возвращает один и тот же адрес. Попробуй так, зацени разницу:
char *_itoa(int i) {
  static int slot;
  static char buf[10][2];
  slot = (slot + 1) % 10;
  buf[slot][0] = i + '0';
  buf[slot][1] = '\0';
  return buf[slot];
}

int main() {

  printf("%s + %s = %s", _itoa(2), _itoa(2), itoa(4));
  _getch();
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы