Почему% d не может автоматически преобразовать значение с плавающей точкой в ​​int в printf ()? - PullRequest
0 голосов
/ 11 мая 2018

Я читаю. Начинающееся программирование на C для чайников наткнулось на код, который я не мог понять

#include <stdio.h>

int main(void) 
{
    printf("The total is %d\n", 16.0 + 17);
}

Он отображает вывод как:

The total is 0

Я думал, что сначала 16.0 + 17 автоматически наберет приведение к 16.0 + 17.0 = 33.0, тогда дробная часть будет усечена во время печати его значения, и окончательный результат будет:

The total is 33

Можете ли вы объяснить, почему результат получается 0:

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Объявление printf выглядит так:

int printf(const char *format, ...);

Он принимает аргументы переменной длины, где первый format является обязательным. Но он не может знать типы более поздних аргументов заранее, то есть во время компиляции. Таким образом, чтобы определить тип для более поздних аргументов, т. Е. Узнать, сколько байтов он должен прочитать из памяти, как интерпретировать эти байты и т. Д., Он полностью зависит от спецификатора формата, присутствующего в строке формата.

И по этой причине спецификатор формата и фактический тип должны совпадать. В противном случае это будет неопределенное поведение, и в этом случае может произойти что угодно.

0 голосов
/ 11 мая 2018

C (также C ++) имеет понятие неопределенного поведения (UB).Есть определенные вещи, которые вам не разрешено делать в соответствии с правилами языка.Если вы нарушаете такие правила, вы не можете ожидать какого-либо разумного результата.%d ожидает int, если вы передадите ему float (или скажете double), вы попадете в область неопределенного поведения.Познакомьтесь с UB .

В конце вам необходимо ознакомиться со всеми правилами, которые вызывают UB (в стандарте более 100 вещей, которые вызывают UB);но поскольку вы сейчас изучаете C, вам не обязательно знакомиться со всеми из них, просто знайте, что существует такая вещь, как UB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...