Наиболее вероятная причина того, что m
является 0
в вашем фрагменте, заключается в том, что вы присваиваете m
значение этого значения в теле вашего оператора if, но поскольку код содержит неопределенное поведение никто не может сказать это наверняка.
Вероятная история про прохождение short*
, когда scanf ожидает int*
Предполагая sizeof(short) = 2
и sizeof(int) == 4
.
При входе в основную функцию стек, в котором находятся переменные, обычно будет выглядеть примерно так:
_
|short int (a) : scanf will try to read an int (4 bytes).
|_ 2 bytes : This part of memory will most
|int (n) : likely be overwritten
| :..
|
|_ 4 bytes
|int (m)
|
|
|_ 4 bytes
Когда вы читаете %d
(т.е. int
) впеременная a
, которая не должна влиять на переменную m
, хотя n
, скорее всего, ее части будут перезаписаны.
Неопределенное поведение
Хотя все это предположениеигра, так как вы используете то, что мы обычно называем " неопределенное поведение " при использовании вашего выражения scanf.
Все, что стандарт не гарантирует, это UB, и результатом может быть что угодно.Возможно, вы запишете данные в другой сегмент, который является частью другой переменной, или, возможно, вы заставите юниверс взорваться.
Никто не может гарантировать, что мы доживем до того дня, когда появится UB.
Как читать short int
, используя scanf
Используйте %hd
, и обязательно передайте его short*
.. у нас достаточно UB на одну ночь!