sizeof
- это оператор, а не функция
Итак, вы выполняете оператор запятой, который возвращает правильный операнд в качестве результата.
В C ++ это ссылка,так что это все еще массив и его полный размер.
В C, в выражении (что-либо с оператором) обычно тип array of x
преобразуется в pointer to x
.Но есть специальное исключение для двух операторов: sizeof
и &
.
Так что имеет значение, будет ли sizeof
первым или нет, из-за исключения из правил преобразования.(См. Раздел C99 6.3.2.1. † )
Это можно увидеть по-другому, и здесь программа возвращает то же самое в C и C ++.
#include <stdio.h>
int main(void) {
char arr[100];
printf("%d\n", (int)sizeof arr);
printf("%d\n", (int)sizeof(arr + 0));
return 0;
}
результат на моем Mac:
100
8
† 6.3.2.1 (3) За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или используется строковый литералчтобы инициализировать массив, выражение с типом '' массив из тип '' преобразуется в выражение с указателем типа '' на тип '', которое указывает на начальный элементобъект массива и не является lvalue.