Почему nData
не может быть 12.0
или 12
с sizeof(nData += 2.0)
?
Ну, sizeof
является компиляторомоператор времени , и он работает с типом данных, а не со значением.
Другими словами, за исключением случаев, когда аргумент является VLA , операнд sizeof
не являетсяоцененный.
Цитирование C11
, глава §6.5.3.4
Оператор sizeof
возвращает размер (в байтах) своего операнда, который может быть выражением илиимя типа в скобках.Размер определяется по типу операнда.Если тип операнда является типом массива переменной длины, операнд оценивается;в противном случае, операнд не вычисляется, и результатом является целочисленная константа.
Так что, в вашем случае,
printf("%d", sizeof(nData + 2.0)); // data == int, 2.0 == double
совпадает с
printf("%d", sizeof(double)); // as the resulting "type" of the addition,
// 'int + double' would be 'double'
, который должен быть лучше
printf("%zu", sizeof(double)); //not %d
, поскольку sizeof
приводит к типу size_t
.
Также относительно 2.0
типа double
из главы §6.4.4.2
Плавающая константа имеет значимую часть, за которой может следовать часть экспоненты и суффикс, указывающий ее тип.Компоненты значимой части могут включать в себя последовательность цифр, представляющую часть целого числа, за которой следует точка (.), За которой следует последовательность цифр, представляющая часть дроби.[...]
и
Нефиксированная плавающая константа имеет тип double
.[...]
Таким образом, постоянное значение типа 2.0
имеет тип double
.