разница в значении uint16_t с printf

Результат ниже программы - co uint16_t first = 10 , second = 20 , third = 30 ; // printf ("% p n", & first); scanf ( "% d" , & second ); // «% d» используется намеренно. printf ( "%" SCNu16 "" , сначала ); printf ( "%" SCNu16 "" , второй ); printf ( "%" SCNu16 " n" , третья ); fusiprintfg.

"%d"

С первым scanfкомментарием я получаю "%" SCNu16. (The %dв printfможет быть причиной этого. Он отлично работает , если я использую 0 20 30вместо printf).

С первым раскомментированным я получаю . Путаница - почему возникает разница в выходе? Это последовательное поведение. scanf("%d", &second); %dint

c,gcc,printf,scanf,

-2

Ответов: 2


1

В вашем коде,

C11

это неопределенное поведение. fscanfожидает, что аргумент будет указателем на целочисленный тип sign ( int).

Цитирование *, глава A§7.21.6.2, SCNuфункция

[...] Если подавление присваивания не было указано а N, результат преобразования помещается в объект, на который указывает первый аргумент, следующий за аргументом формата, который еще не получил результат преобразования. Если этот объект не имеет соответствующего типа или если результат преобразования не может быть представлен в объекте, поведение не определено.

Тем не менее, fscanfNмакрос для fprintf()семьи, у PRIuсемьи есть аналоги NN.


0

Если это «последовательное поведение» или нет, это зависит от вашего определения. Я получаю такое же поведение, когда запускаю ваш код, но это не меняет того факта, что у вас есть неопределенное поведение в вашей программе.

Я попробовал скомпилировать его, -O3а затем я получил результат 10 20 30при подаче ввода 20, как с printfзаявлением , так и без него .

Поэтому, хотя может быть интересно рассказать о том, почему ваш код ведет себя так, как это делается, это не очень важно. Код недействителен, поэтому у вас нет гарантий.

Я также попытался переключить порядок объявления переменных: uint16_t third=30, second=20, first=10;поведение изменилось, хотя оно не должно быть, если код был действительным.

с, GCC, Printf, зсапЕ,
Похожие вопросы
Яндекс.Метрика