Результаты прохождения теста C основы пользователем Akread

Результат прохождения теста "C основы" - Не пройден

+24

  • Кто проходил: Akread
  • Дата прохождения: 18.10.2017
Что произойдет в результате компиляции и выполнения данного кода:
#include <stdio.h> 
 
void f() { printf("%d", 1); } 
 
int main() { 
   void (*a)() = f; // 1 
   a();             // 2 
   return 0; 
} 
Ваши ответы
Будет напечатано число 1
Что выведет следующая программа:
#include <stdio.h> 
int main () 
{ 
   int i = 0; 
   while (++i < 5) 
   { 
       printf("%d", i%2);        
   } 
   return 0; 
} 
Ваши ответы
1010
Укажите допустимые в C литералы:
Ваши ответы
1
Есть ли ошибка (синтаксическая, UB, и т.д.) в данном участке кода?
char * a; 
strcpy(a, "Hello, World");  
Ваши ответы
Да
Объяснение:

Код откомпилируется. Ошибка в использовании указателя для которого не выделена память (строка 2). Как будет проявляться при запуске зависит от компилятора. Если компилятор обнуляет указатели, то будет access violation, если нет, то последствия непредсказуемы.

В каких строчках кода содержатся ошибки?
struct A { 
 char a[];  // 1 
}; 
 
struct B { 
 char a; 
 char b[];  // 2 
}; 
 
struct C { 
 char a[];  // 3 
 char b; 
}; 
 
int main() { 
 char a[];  // 4 
 return 0; 
} 
 
void test(char a[]) { // 5 
} 
Ваши ответы
// 5
Объяснение:

Расширяемый массив может находиться только в конце структуры, содержащей хотя бы один другой элемент. Поэтому строчки 1 и 3 содержат ошибки. Строчка 4 не верна, потому что объявленный таким образом массив должен быть проинициализирован тут же.

Укажите корректный вариант объявления массива
Ваши ответы
int array[];
что будет выведено на экран?
#include <stdio.h> 
 
#define A(a) # a 
#define B(a, b) A(a ## b ## c) 
 
int main() { 
 printf("%s", B(foo, bar)); 
 return 0; 
} 
Ваши ответы
программа не скомпилируется
Объяснение:

Макрос B() объединит лексемы foo, bar и c и образует лексему foobarc, которая затем будет преобразована в строковый литерал "foobarc" с помощью макроса A()

Как правильно обратиться к элементу a переменной st:
struct Structure { 
   int a; 
} st; 
Ваши ответы
st->a
Что выведет программа:
int a; 
double b = 2; 
a = 2 * (b * 5/2) / (5/2); 
printf("%d", a); 
Ваши ответы
4.000000
Объяснение:

(5 / 2) равно 2, так как 5 и 2 - это целые числа

что выведет эта программа?
#include <stdio.h> 
 
#define A(b) "" #b "" "c" 
 
int main() { 
 printf("%s", A(a)A(A(a))); 
 return 0; 
} 
Ваши ответы
acacc
Что выведет следующая программа?
double a; 
double b = 2; 
a = b * 5 / 2 + 5 / 2 * b; 
printf ("% f", a); 
Ваши ответы
5.000000
Объяснение:

b = 2.0 b * 5 / 2 = (2.0 * 5) / 2 = 10.0 / 2 = 5.0 5 / 2 * b = (5 / 2) * 2.0 = 2 * 2.0 = 4.0 a = 5.0 + 4.0 = 9.0

Является ли знак , (запятая) оператором в C?
Ваши ответы
Нет
Объяснение:

Да, это оператор последовательного вычисления

Что выведет такая программа?
#include <stdio.h> 
 
int main() { 
 const char *p = "11%5lu=1\n"; 
 printf(p); 
 return 0; 
} 
Ваши ответы
11%5lu=1
Объяснение:

Строчка p содержит поле подстановки %5lu, значение для которого функция printf() попытается вытянуть со стека, что может привести к undefined behaviour.

Что произойдёт в результате выполнения следующего кода?
#include <stdio.h> 
int main(void) { 
   int a = 1, b = 66, c; 
   if(b > 50) { 
       int c = b - a;  // (1) 
   } 
   printf("%d", c); 
} 
Ваши ответы
Программа корректно завершит свою работу, ничего не выводя на экран
Чему будет равно значение x: int x = (3, --x + 2);
Ваши ответы
4
Объяснение:

Значение x в стеке не инициализируется. Оператор запятая возвращает правый аргумент, т.е. --x + 2. Следовательно значение не определено.