Оператор sizeof

Задания раздела 4.9
4.28. Напишите программу для вывода размера каждого из встроенных типов.
4.29. Предскажите вывод следующего кода и объясните свое рассуждение. Напишите и выполните соответствующую программу. Совпадает ли вывод с ожиданиями? Если нет, то почему?
int x[10];
int *p=x;
cout << sizeof(x)/sizeof(*x)<<endl;
cout << sizeof(p)/sizeof(*p)<<endl;
4.30. Используя таблицу из раздела 4.12 расставьте скобки в следующих выражениях так, чтобы продемонстрировать порядок его обработки:
(a) sizeof x+y
(b) sizeof p->mem[i]
(c) sizeof a<b
(d) sizeof f()

Результат оператора sizeof - константное выражение типа size_t. Имеет две формы синтаксиса:
sizeof (тип)
sizeof выражение
во второй форме оператор возвращает размер типа, возвращаемого выражением. sizof не выполняет свой операнд, поэтому в выражении
sizeof *p;
указатель может быть неопределен.
Результат применения оператора sizeof:
1. Если это тип char или выражение, результат которого имеет тип char, то это гарантированного будет 1.
2. Если это ссылка, то возвращает размер объекта, на который она ссылается.
3. Если это указатель, то возвращается размер, необходимый для хранения указателя.
4. Если это обращение к значению указателя, то возвращается размер типа объекта, на который он указывает, вне зависимости от его допустимости.
5. Если это массив, то возвращает размер всего массива. Это эквивалентно получению размера элемента массива и его умножению на количество элементов. Sizeof не преобразует массив в указатель.
6. Если это строка или вектор, то возвращает размер только фиксированной части этих типов; но не размер, используемый элементами объекта.

Так же стоит сказать, что оператор sizeof не обязан выбирать член класса, чтобы узнать его размер.
Sales_data data;
sizeof data.revenue;
sizeof Sales_data::revenue; // то же самое что и выражение выше

4.28. Напишите программу для вывода размера каждого из встроенных типов.
Уже писал и можно найти в поиске по слову sizeof.

4.29. Предскажите вывод следующего кода и объясните свое рассуждение. Напишите и выполните соответствующую программу. Совпадает ли вывод с ожиданиями? Если нет, то почему?
int x[10];
int *p=x;
cout << sizeof(x)/sizeof(*x)<<endl;
cout << sizeof(p)/sizeof(*p)<<endl;
Совпадает. Вывод программы: 10 1
#include <iostream>
int main()
{
int x[10];
int *p=x;
std::cout << sizeof(x)/sizeof(*x)<<std::endl;
std::cout << sizeof(p)/sizeof(*p)<<std::endl;
return(0);
}

4.30. Используя таблицу из раздела 4.12 расставьте скобки в следующих выражениях так, чтобы продемонстрировать порядок его обработки:
(a) (sizeof x)+y
(b) sizeof (p->mem[i])
(c) (sizeof a)<b
(d) sizeof (f())

Приоритет у sizeof достаточно высокий. Выше него в приоритете инкремент/декремент, побитовое и логическое NOT , унарные, вызов функции, обращение к члену класса. А все остальные приоритетом ниже: бинарные операторы, операторы сравнения, побитовые операторы и все остальные логические. (см. тему выше с приоритетами операторов).

(a) (sizeof x)+y
(b) sizeof (p->mem[i])
(c) (sizeof a)<b
(d) sizeof (f())

Добавить комментарий