C C  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Функции и область видимости

Тест связывает прототипы, передачу аргументов, возврат результата и время жизни объектов. Вопросы требуют отличать копию параметра от исходного объекта и находить интерфейсы, где владение или ошибка выражены неясно.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Чем `int parse();` отличается от `int parse(void);` в C17?
Вопрос 2 из 20
Какой вариант корректно даёт компилятору прототип до первого вызова?
CВызов до определения
int main(void) {
    return twice(21);
}

int twice(int x) {
    return x * 2;
}
Вопрос 3 из 20
Что является определением функции, а не только объявлением?
CC17
int f(int);

int main(void) {
    return f(4);
}

/* Какую запись нужно добавить, чтобы в этой единице трансляции появилось определение f? */
Вопрос 4 из 20
Почему несовместимые объявления одной функции в разных файлах опасны даже если линковщик собрал программу?
CC17
/* a.c */ double measure(int);
/* b.c */ int measure(double);
Вопрос 5 из 20
Где лучше разместить объявление публичной функции, используемой несколькими .c-файлами?
Вопрос 6 из 20
Какое значение x останется после вызова функции set?
CC17
#include <stdio.h>

static void set(int v) { v = 9; }

int main(void) {
    int x = 5;
    set(x);
    printf("%d\n", x);
}
Вопрос 7 из 20
Как изменить функцию, чтобы она действительно записывала 9 в объект вызывающей стороны?
CПередача аргумента по значению
#include <stdio.h>

void set(int x) {
    x = 9;
}

int main(void) {
    int n = 5;
    set(n);
    printf("%d\n", n);
}
Вопрос 8 из 20
Что означает параметр `int a[10]` в объявлении функции?
CC17
void process(int a[10]);
Вопрос 9 из 20
Какой вызов соответствует функции `void swap(int *a, int *b)`?
CC17
int x = 1, y = 2;
/* вызов swap */
Вопрос 10 из 20
Функция принимает буфер для записи. Какой набор параметров лучше всего делает контракт проверяемым?
Вопрос 11 из 20
Почему возвращённый этой функцией указатель нельзя безопасно использовать после выхода из `make_name`?
CC17
char *make_name(void) {
    char name[16] = "Ada";
    return name;
}
Вопрос 12 из 20
Какой интерфейс яснее сообщает одновременно результат деления и возможную ошибку деления на ноль?
CКонтракт функции деления
/* Нужно целочисленное деление: частное может законно быть 0. */
/* Как отделить результат от ошибки b == 0? */
Вопрос 13 из 20
Что происходит при достижении конца функции, объявленной как возвращающая int, если это не main?
CC17
int choose(int x) {
    if (x > 0) return 1;
    /* нет return */
}
Вопрос 14 из 20
Можно ли возвращать структуру по значению?
CC17
struct result { int value; int error; };
struct result parse(const char *s);
Вопрос 15 из 20
Функция возвращает количество записанных байтов или -1 при ошибке. Какой тип результата естественнее?
Вопрос 16 из 20
Какие две строки напечатают последовательные вызовы `f(); f();`?
CC17
#include <stdio.h>

static void f(void) {
    int x = 0;
    static int y = 0;
    printf("%d %d\n", ++x, ++y);
}

int main(void) { f(); f(); }
Вопрос 17 из 20
Как долго существует объект, выделенный malloc?
CC17
int *p = malloc(sizeof *p);
Вопрос 18 из 20
Почему сохранение указателя на compound literal может быть опасным?
CC17
struct point *saved;
void f(void) {
    saved = &(struct point){ .x = 1, .y = 2 };
}
/* здесь saved уже нельзя разыменовывать */
Вопрос 19 из 20
Какой объект безопасно вернуть по адресу из функции без malloc?
CC17
const char *status_text(int code) {
    static char buf[32];
    /* ... */
    return buf;
}
Вопрос 20 из 20
Какой вопрос первым задают при обнаружении утечки?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу