У меня есть два кода и два вопроса.
Вопрос по первому коду: было ли сделано целочисленное повышение? Я имею в виду, 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