Тернарные операторы в C - PullRequest
       87

Тернарные операторы в C

3 голосов
/ 12 марта 2020
#include <stdio.h>
int main()
{
    int x = 1;
    short int i = 2;
    float f = 3;
    if (sizeof((x == 2) ? f : i) == sizeof(float)) 
        printf("float\n");
    else if (sizeof((x == 2) ? f : i) == sizeof(short int))
        printf("short int\n");
}

Выход "float". Поэтому я не понимаю, почему sizeof((x==2)?f:i) всегда возвращает 4. Я думаю, что в объявлении отсутствует переменная на (x==2)?f:i; Но она всегда возвращает 4(sizeof(f)).

Можете ли вы помочь мне! Это первый язык программирования, который я изучаю. Я знаю этот вопрос очень глупо, но со мной очень трудно. Спасибо, что потратили ваше время :) Удачного дня;)

И в первый раз, когда я пытаюсь использовать Stackoverflow, возможно, есть некоторые ошибки. Надеюсь, ты простишь меня

1 Ответ

7 голосов
/ 12 марта 2020

Тип выражения определяется статически во время компиляции.

Таким образом, тип и размер выражения (x == 2) ? f : i известны во время компиляции и не изменятся во время выполнения, независимо от того, какие значения переменных.

Тип результата троичного оператора в этом случае определяется с использованием обычных арифметических c преобразований ( C99 6.5.15p5 и C99 6.3.1.8p1 ). Тип (x == 2) ? f : i определяется как float.

Целое sizeof((x == 2) ? f : i) вычисляется во время компиляции и равно sizeof(float).

Вы можете переместить x == 2 из sizeof, чтобы он оценивался во время выполнения:

if ((x == 2 ? sizeof(f) : sizeof(i)) == sizeof(float))

Также обратите внимание, что может случиться так, что sizeof(short int) == sizeof(float).

...