Но я бы ожидал: ...
Когда строка формата не совпадают с типами аргументов для того, поведение не определено. Все может случиться. Вы ничего не можете ожидать (и я не понимаю, почему вы ожидаете 0. Возможно, вы ожидаете, что printf
использует строку формата для преобразования аргументов между плавающей точкой и целым числом. Это просто так. Это вариационная функция, как вы могли бы написать ваш собственный, и тот факт, что строка формата кодирует типы возвращающих аргументов, не используется для их преобразования).
Современные соглашения об использовании используют регистры для первых нескольких аргументов и могут использовать регистры даже для вариативных функций.На x86-64 соглашение может быть, например, что первый аргумент с плавающей запятой переменной переменной всегда можно ожидать в регистре с плавающей запятой xmm0
, тогда как целые аргументы передаются в регистры общего назначения %rdi
, %rsi
, %rdx
, ... Это приводит к тому, что printf("%f %d", 1, 1.0)
печатает аргумент с плавающей запятой, за которым следует целочисленный аргумент.
В качестве иллюстрации, вот короткая программа:
#include <stdio.h>
int main(){
printf("%d, %f, %d\n", 0.9, 10, 'C');
printf("%d, %f, %d\n", 10, 0.9, 'C');
}
Это как мой компилятор (Clang на Mac OS X 10.6) компилирует программу:
leaq <memory location of format string>, %rbx
movq %rbx, %rdi
movsd <memory location of 0.9 constant>, %xmm0
movl $10, %esi
movl $67, %edx
movb $1, %al
callq _printf
movq %rbx, %rdi
movl $10, %esi
movsd <memory location of 0.9 constant>, %xmm0
movl $67, %edx
movb $1, %al
callq _printf
…
Очевидно, что два вызова дают одинаковый результат. Но в случае одного он случайный и работает только для этой конкретной версии компилятора и ABI, тогда как другой относится к стандарту и должен работать где угодно.
Опять же, printf("%d %f", 0.9, 10)
- это неопределенное поведение, и вы не должны его использовать ни при каких обстоятельствах.
Этот ответ предполагает, что аргументы 'printf' передаются в стеке, что очень маловероятно для получения результатов, указанных в вопросе. –