почему результат sizeof для третичной эксплуатации 4? - PullRequest
0 голосов
/ 09 октября 2018

, кто может помочь объяснить результат программы:

  int main()
    {
    char a=1;
    short b=1;

    printf("%d\n", sizeof((b==a)?a:b));
    printf("%d %d", sizeof(a), sizeof(b));

    return 0;
    }

распечатка -

4
1 2

Ответы [ 2 ]

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

Из стандарта C # 6.5.3.4p2 [выделение шахты]

2 Оператор sizeof возвращает размер (в байтах) своего операнда, который может быть выражениемили имя типа в скобках. Размер определяется по типу операнда .Результатом является целое число.Если тип операнда является типом массива переменной длины, операнд оценивается;в противном случае, операнд не оценивается, а результатом является целочисленная константа.

В выражении:

sizeof((b==a)?a:b)

char и short будут преобразованы в int из-за повышения по умолчанию типа 1) и все выражение оценивается как тип int.Следовательно, вы получаете вывод как 4.

Кроме того, тип результата оператора sizeof равен size_t.Вы должны использовать спецификатор формата %zu вместо %d.


1) По умолчанию Акции и преобразования типов

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

Когда в выражении используется целочисленное значение, тип которого имеет ранг ниже, чем int (например, char или short), оно автоматически повышается до типа int.

В случае выражения (b==a)?a:b оба возможных значения повышаются до типа int, поэтому выражение в целом имеет тип int.Следовательно, оператор sizeof оценивает размер int, который на вашем компьютере равен 4.

Также обратите внимание, что выражение, переданное в sizeof, равно , а не , оцененному вво время выполнения.Он только анализируется компилятором, чтобы определить его тип.Единственный раз, когда операнд sizeof вычисляется во время выполнения, это если операнд является массивом переменной длины.

...