| Отличие форматов "%d" и "%zd" на языке C |
|
| Добавил(а) microsin |
|
Отличие между "%d" и "%zd" в языке C заключается в том, для какого типа данных они предназначены и как обрабатывают потенциальное различие в размере типа int и size_t. Формат "%d". Назначение: для типа int (знаковое целое, обычно 4 байта). Возможная проблема: если вы передаёте значение типа size_t (беззнаковое, обычно 8 байт на 64-битных системах) в printf с использованием "%d", то: - Произойдёт неопределённое поведение (Undefined Behavior, UB), так как тип не соответствует спецификатору. Формат "%zd" (введён в C99). Назначение: специально для типа size_t (беззнаковый результат `sizeof`, индексы массивов и т.д.). Преимущество: - Автоматически подстраивается под реальный размер size_t (4 или 8 байт). Пример различий: #include < stdio.h> Другие похожие спецификаторы: "%zu" — для size_t (беззнаковый вывод, z + u). Какой формат когда использовать? - Всегда используйте "%zd" или "%zu" для вывода значений, связанных с sizeof, strlen, индексами в size_t, длинами контейнеров в безопасном коде. Игнорирование этого различия — частая причина трудноуловимых ошибок при переносе кода между 32-битными и 64-битными платформами. [Ссылки] 1. Секреты printf. |