У меня есть два кода и два вопроса.
Вопрос по первому коду: было ли сделано целочисленное повышение? Я имею в виду, y --> Повышение до int --> преобразование в Double? или y--> преобразование в Double? какое из них верно?
Вопрос по второму коду: было ли сделано целочисленное повышение? Я имею в виду, x и y -> Повышение до int?
//First code
#include <stdio.h>
int main() {
double x=17.123;
short y=13;
x+y;
return 0;
}
//Second Code
#include <stdio.h>
int main() {
short x=17;
short y=13;
x+y;
return 0;
}
привет большое спасибо. Я буду читать! можете ли вы ответить на мой вопрос, пожалуйста? С уважением.
Повышение никогда не выполняется, если оба операнда имеют один и тот же тип. Так зачем же второму коду какое-либо продвижение?
Это похоже на домашнее задание. Если это так, вы научитесь лучше, выяснив это самостоятельно.
привет, это не домашнее задание, я пытаюсь изучить программирование и улучшить свой английский.
То, что вы делаете, пытаясь чему-то научиться, похоже на домашнее задание. Напишите, какой, по вашему мнению, ответ и почему. Если вы ошибаетесь, мы объясним почему, и вы узнаете.
Обратите внимание, что x+y; как простое выражение в вашем коде ничего не делает. Во время тестирования вы уверены, что ваш компилятор не оптимизирует это просто так, делая вопрос о продвижении неактуальным?
@Barmar: В одном из предыдущих комментариев вы написали: "Promotions are never done when both operands are the same type." -- Я считаю, что это утверждение неверно. В ссылке на стандарт ISO C11, опубликованной кем-то другим, стандарт гласит: "Otherwise, the integer promotions are performed on both operands." В этом предложении «иначе» означает, что ни один из операндов не является типом с плавающей запятой.
Я провел исследование. Вот мой результат: целочисленные повышения выполняются, если в выражении есть только целочисленные типы. Первый код не содержит целочисленного повышения. Я понятия не имею о втором коде. редактировать: окей, я понимаю. второй код целочисленного продвижения отсутствует. Кстати, все мои результаты верны?
@AndreasWenzel, можешь проверить мой последний комментарий?
@İlkerDeveci: Я считаю, что ваши рассуждения о первом коде верны. Однако во втором коде, насколько я могу судить, оба операнда повышены до int.
@Бармар, можешь проверить мой последний комментарий?
@AndreasWenzel Я неправильно прочитал первый пункт после этого, говоря, что никаких рекламных акций не проводится.





Вопрос по первому коду: было ли сделано целочисленное повышение? Я имею в виду, y --> Повышение до int --> преобразование в Double? или y--> преобразование в Double? какое из них верно?
Нет, целочисленного продвижения нет. Для двоичного + в C 2018 6.5.6 4 говорится: «Если оба операнда имеют арифметический тип, над ними выполняются обычные арифметические преобразования». Обычные арифметические преобразования указаны в 6.3.1.8. 1. Для добавления double и short нам нужно учитывать только первые два правила:
Во-первых, если соответствующий реальный тип любого операнда равен
long double, другой операнд преобразуется без изменения домена типа в тип, соответствующий действительный тип которого равенlong double.В противном случае, если соответствующий реальный тип любого операнда равен
double, другой операнд преобразуется без изменения домена типа в тип, соответствующий реальный тип которого равенdouble.
Таким образом, short преобразуется в double. Остальные правила в списке начинаются с «Иначе» и, следовательно, не применяются.
(Домен типа относится к вещественному или сложному и нас здесь не касается.)
Вопрос по второму коду: было ли сделано целочисленное повышение? Я имею в виду, x и y -> Повышение до int?
Да, существует целочисленная акция. Для добавления short и short рассмотрим дополнительные правила:
В противном случае, если соответствующий реальный тип любого операнда равен
float, другой операнд преобразуется без изменения домена типа в тип, соответствующий реальный тип которого равенfloat.В противном случае целочисленные преобразования выполняются для обоих операндов. Затем к расширенным операндам применяются следующие правила:…
Таким образом, целочисленные преобразования выполняются для обоих операндов. Это преобразует их обоих в int, согласно 6.3.1.1 2:
Если
intможет представлять все значения исходного типа (в зависимости от ширины битового поля), значение преобразуется вint; в противном случае он преобразуется в беззнаковыйint.
Прочтите об этом: port70.net/~nsz/c/c11/n1570.html#6.3.1.8