значение непосредственного операнда приведения - PullRequest
0 голосов
/ 09 октября 2018

Я смотрел на этот ТАК.Хотел бы знать две вещи

  1. Стандарт C99 гласит:

Целочисленное константное выражение должно иметь целочисленный тип

Но не уверен, еслиlong long и long также обрабатываются одинаково.Я попытался с приведенным ниже примером и не получил никаких предупреждений или ошибок компилятора.Так что я думаю, целое число означает enum, char, int, long и long long.

int main(void)
{
    unsigned long long a=4294967296LL; // no need of LL
    switch (a)
    {
    case 4294967296:
        printf("Hello");
        break;
    }
return(0);
}
Может ли кто-нибудь объяснить значение «непосредственных операндов приведений» в выражении «Целочисленное константное выражение должно иметь целочисленный тип и должно иметь только операнды, которые являются целочисленными константами, ..... чьи результаты являются плавающими константами, которые являютсянепосредственные операнды приведений "

(в том же сообщении SO есть один оставшийся без ответа комментарий @ user963241).

Оцените один пример варианта коммутатора, чтобы обосновать использование плавающих констант, которые являются непосредственными операндами приведений.

Я использую MinGW 32-битный компилятор.

1 Ответ

0 голосов
/ 09 октября 2018

Согласно разделу 6.2.5 «Типы в стандартном черновике C» (N1570):

Существует пять стандартных целочисленных типов, обозначенных как char, short int, int, long int, long long int.

У них есть signed и unsigned дубликаты.

Значение «плавающих констант, которые являются непосредственными операндами приведений» означает, что операндом приведения является сам по себе (не после некоторых арифметических вычислений) является плавающей константой.

Например:

(int)(3.14f) //1. Here the operand is an floating constant that is an immediate operand 

(int)(22.0/7.0f) //2. Here the operand is NOT an floating constant that is an immediate operand. 

Вы можете использовать 1 в операторе switch case следующим образом:

switch(op) {
  case (int)(3.14f):
  break;
}
...