10 вопросов по С. part2 - C (СИ)
Формулировка задачи:
1) почему не равнозначны записи x = 0x10l и х = 0х1е1l ? Хотя int x = 10 == int x = 1e1;
2) Все правила при применении операции приведения типа. Объяснить пример:
unsigned int a = 100;
signed int b = -99;
printf ("%d %d %d", a, b, a > b);
3) char* str = "qwerty";
str [5] = 'Y';
По идее идет попытка изменения значения константной строки. Но почему ошибка не
обнаружилась на этапе компиляции, например как здесь:
const char arr [] = "qwerty";
*arr = '5';
*И вообще, отчего зависит, когда будет обнаружена ошибка (на этапе компил. или уже в процессе выполнения) ?
4) отрицание (воскл. знак) битовая операция? Как происходит преобразование не нуля
в 0 и 0 в 1?
5) long double. Почему его размер не представляется в виде степени двойки??????
(у меня зайзоф 12!). Все, которые не взять: чар, шорт, указатель, лонг лонг... --
представляются в виде 2^n, а он нет. И вообще, почему все типы (кроме ldouble)
представляются в виде 2^n (с чем этто связано)?
6)
a) void f1 (int){;}
main () {void (*b) (int) = f1;}
Все работает.
b) А если написать вместо определения ф1 только ее прототип, то андефенид референс. Как это отслеживается?
7) Что означает запись: void *b [10] (int); ?
без массива, ф-ия, возвращающая указатель на воид (кстати, что из себя представляет указатель на воид?)
если *b [10] взять в скобки, то это массив ук. на ф-ию.
А конкретно такая запись как трактуется?
8) Почему нижеследующий код иногда правильно работает (допущена ошибка к доступу несуществ. эл массива)?
void f1 (int);
main ()
{
void (*b []) (int) = {f1, f1, f1};
(b [3]) (5);
}
void f1 (int a) {printf ("Hello world!");}
9) volatile. что это такое и с чем его едят.
10) различия между new и malloc () / calloc ()
Решение задачи: «10 вопросов по С. part2»
textual
Листинг программы
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) { // report no memory static const std::bad_alloc nomem; _RAISE(nomem); } return (p); }
Объяснение кода листинга программы
- Передача размера в оператор new
- Попытка выделения памяти с помощью malloc
- Проверка, не равно ли выделенное значение нулю
- Если выделенное значение равно нулю, попытка вызова _callnewh
- Если _callnewh вернул ноль, проверка на отсутствие памяти
- Если проверка на отсутствие памяти вернула значение, инициализация объекта std::bad_alloc
- Восстановление контекста предыдущего броска исключения
- Возврат выделенного значения
- Вызов _RAISE с переданным объектом исключения
- Возврат нулевого значения при успешном выделении памяти
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д