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

Типы, переменные и операторы C

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

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. Код читайте построчно: часть заданий проверяет вывод, часть — поиск дефекта, переносимость и безопасное исправление. После завершения откроются объяснения и профиль по 4 темам.
Вопрос 1 из 20
Программа должна хранить количество байтов, возвращённое sizeof. Какой тип соответствует назначению без предположений о разрядности платформы?
Вопрос 2 из 20
Что напечатает программа на любой реализации C17, где CHAR_BIT не меньше 8?
CC17
#include <limits.h>
#include <stdio.h>

int main(void) {
    unsigned char x = 0;
    x = x - 1;
    printf("%d\n", x == UCHAR_MAX);
}
Вопрос 3 из 20
В коде счётчик может принимать значения от 0 до 70 000. Какое объявление гарантирует достаточный диапазон по стандарту C17?
CC17
#include <limits.h>

/* count должен представлять каждое значение от 0 до 70000 на любой реализации C17. */
count = 70000;
Вопрос 4 из 20
Какой вывод гарантирован стандартом?
CC17
#include <stdio.h>

int main(void) {
    printf("%zu %zu\n", sizeof(char), sizeof(short));
}
Вопрос 5 из 20
Функция получает индекс элемента массива и должна уметь выразить разность двух указателей в одном массиве. Какой тип лучше использовать для такой разности?
CC17
/* Какой тип результата выбрать? */
result = end - begin;
Вопрос 6 из 20
Почему условие может оказаться ложным, хотя математически сумма равна 0.3?
CC17
#include <stdio.h>

int main(void) {
    double x = 0.1 + 0.2;
    printf("%d\n", x == 0.3);
}
Вопрос 7 из 20
Какое изменение лучше всего сохраняет точность при суммировании миллиона небольших значений, если интерфейс сейчас использует float?
Вопрос 8 из 20
Что напечатает программа при обычной реализации IEEE 754 с точным представлением всех целых до 2^53, если double имеет 53 бита точности?
CC17
#include <stdio.h>

int main(void) {
    double x = 9007199254740992.0;
    printf("%d\n", x + 1.0 > x);
}
Вопрос 9 из 20
Какой спецификатор printf корректен для переменной типа double?
CC17
double temperature = 21.75;
printf("...\n", temperature);
Вопрос 10 из 20
Функция проверяет, близки ли два результата измерения порядка 10^9 и 10^-9. Какой подход наиболее надёжен?
CC17
int nearly_equal(double a, double b) {
    /* Какой принцип проверки выбрать? */
}
Вопрос 11 из 20
Какой вывод гарантирован?
CC17
#include <stdio.h>

static int bump(int *p) { ++*p; return 1; }

int main(void) {
    int x = 0;
    int r = x && bump(&x);
    printf("%d %d\n", r, x);
}
Вопрос 12 из 20
Какое значение вычислит выражение с учётом приоритета умножения?
CC17
#include <stdio.h>

int main(void) {
    int x = 1 + 3 * 2 + 2;
    printf("%d\n", x);
}
Вопрос 13 из 20
Почему выражение нельзя использовать для надёжного вычисления результата?
CC17
#include <stdio.h>

int main(void) {
    int i = 1;
    printf("%d\n", i++ + ++i);
}
Вопрос 14 из 20
Как переписать условие, чтобы намерение было ясным и значение x увеличивалось только при готовом объекте?
CПобочный эффект внутри условия
struct item *item = get_item();
size_t x = current;

if (item != NULL && item->ready && x++ < limit) {
    handle(item, x);
}
Вопрос 15 из 20
В проверке флага написано `if (flags & READY == READY)`. Как компилятор расставляет скобки?
Вопрос 16 из 20
Что напечатает программа на реализации, где int может представить все значения unsigned char?
CC17
#include <stdio.h>

int main(void) {
    unsigned char a = 250, b = 10;
    unsigned char c = a + b;
    printf("%d\n", c == 4);
}
Вопрос 17 из 20
Почему сравнение `s < u` печатает 0, хотя `s` содержит отрицательное значение?
CC17
#include <stdio.h>

int main(void) {
    unsigned int u = 1;
    int s = -1;
    printf("%d\n", s < u);
}
Вопрос 18 из 20
Как безопасно преобразовать size_t n в int перед передачей старому API?
CПереход от size_t к int
int legacy_set_count(int count);

int send_count(size_t n) {
    /* выбрать безопасное преобразование */
}
Вопрос 19 из 20
Что гарантированно происходит при преобразовании положительного double 3.9 к int?
CC17
#include <stdio.h>

int main(void) {
    printf("%d\n", (int)3.9);
}
Вопрос 20 из 20
В каком случае явное приведение типа действительно не исправляет проблему, а лишь скрывает предупреждение?

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

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

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

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