Поскольку вы объявили main
без действительной подписи (т. Е. Вы дали ему тип возврата void
), вы не можете ничего предположить относительно значения, которое фактически возвращается операционной системе. Если вы компилируете для архитектуры x86, то вот что вероятно происходит, чтобы объяснить возвращаемое значение 2
:
main:
...
call printf
add esp, 8
; return value from printf is in EAX register
ret
printf
возвращает количество символов, записанных в стандартный вывод, 2 в вашем случае со строкой формата \n%c
. Возвращаемое значение из printf
все еще находится в регистре, предназначенном для хранения возвращаемых значений (EAX
) при выходе из main
, поэтому main
возвращает это.