Целочисленное продвижение в программировании на C

У меня есть два кода и два вопроса.

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

Прочтите об этом: port70.net/~nsz/c/c11/n1570.html#6.3.1.8

Eugene Sh. 09.08.2024 19:20

привет большое спасибо. Я буду читать! можете ли вы ответить на мой вопрос, пожалуйста? С уважением.

İlker Deveci 09.08.2024 19:22

Повышение никогда не выполняется, если оба операнда имеют один и тот же тип. Так зачем же второму коду какое-либо продвижение?

Barmar 09.08.2024 19:25

Это похоже на домашнее задание. Если это так, вы научитесь лучше, выяснив это самостоятельно.

Barmar 09.08.2024 19:27

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

İlker Deveci 09.08.2024 19:28

То, что вы делаете, пытаясь чему-то научиться, похоже на домашнее задание. Напишите, какой, по вашему мнению, ответ и почему. Если вы ошибаетесь, мы объясним почему, и вы узнаете.

Barmar 09.08.2024 19:30

Обратите внимание, что x+y; как простое выражение в вашем коде ничего не делает. Во время тестирования вы уверены, что ваш компилятор не оптимизирует это просто так, делая вопрос о продвижении неактуальным?

Chris 09.08.2024 19:33

@Barmar: В одном из предыдущих комментариев вы написали: "Promotions are never done when both operands are the same type." -- Я считаю, что это утверждение неверно. В ссылке на стандарт ISO C11, опубликованной кем-то другим, стандарт гласит: "Otherwise, the integer promotions are performed on both operands." В этом предложении «иначе» означает, что ни один из операндов не является типом с плавающей запятой.

Andreas Wenzel 09.08.2024 19:35

Я провел исследование. Вот мой результат: целочисленные повышения выполняются, если в выражении есть только целочисленные типы. Первый код не содержит целочисленного повышения. Я понятия не имею о втором коде. редактировать: окей, я понимаю. второй код целочисленного продвижения отсутствует. Кстати, все мои результаты верны?

İlker Deveci 09.08.2024 19:35

@AndreasWenzel, можешь проверить мой последний комментарий?

İlker Deveci 09.08.2024 19:38

@İlkerDeveci: Я считаю, что ваши рассуждения о первом коде верны. Однако во втором коде, насколько я могу судить, оба операнда повышены до int.

Andreas Wenzel 09.08.2024 19:41

@Бармар, можешь проверить мой последний комментарий?

İlker Deveci 09.08.2024 19:41

@AndreasWenzel Я неправильно прочитал первый пункт после этого, говоря, что никаких рекламных акций не проводится.

Barmar 09.08.2024 20:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме