Sprawdź, jak dobrze znasz język C

ucgosu.pl 3 lat temu

Jak oceniasz swoją znajomość C? Czy programowanie w tym języku nie ma przed Tobą żadnych tajemnic? Spróbuj swoich sił w tym quizie!

Quiz składa się z 10 pytań. Każde z nich zawiera krótki program. Twoim zadaniem jest określenie, co program wypisze na konsolę. Pytania są dobrane tak, żeby pokazywać mniej oczywiste zachowania, które jednocześnie są przydatne podczas codziennej pracy z kodem.

Po rozwiązaniu quizu możesz przeczytać wytłumaczenie, dlaczego w danym przypadku program zachowa się tak, a nie inaczej.

Powodzenia!

1.
Co ten program wypisze na konsolę?
#include "stdio.h"
#include "stdint.h"

void fun(int32_t x)
{
if (x + 1 < x)
{
printf("OVERFLOW");
}
else
{
printf("NO OVERFLOW");
}
}

int main(void)
{
fun(INT32_MAX);

return 0;
}
OVERFLOW
NO OVERFLOW
Wynik nie jest zdefiniowany
1 out of 10
2.
Co ten program wypisze na konsolę?
#include "stdio.h"
#include "stdint.h"

void fun(uint32_t x)
{
if (x + 1 < x)
{
printf("OVERFLOW");
}
else
{
printf("NO OVERFLOW");
}
}

int main(void)
{
fun(UINT32_MAX);
return 0;
}
OVERFLOW
NO OVERFLOW
Wynik nie jest zdefiniowany
2 out of 10
3.
Co ten program wypisze na konsolę na maszynie o architekturze 32-bitowej?
#include "stdio.h"
#include "stdint.h"

int main(void)
{
uint8_t a[10];
uint8_t *ptr = a;

printf("%d, %d", sizeof(a), sizeof(ptr));

return 0;
}
10, 10
10, 4
4, 4
3 out of 10
4.
Co ten program wypisze na konsolę na maszynie o architekturze 32-bitowej?
#include "stdio.h"
#include "stdint.h"

void fun(uint8_t a[10])
{
printf("%d", sizeof(a));
}

int main(void)
{
uint8_t a[10];
uint8_t *ptr = a;

fun(a);
printf(", ");
fun(ptr);

return 0;
}
10, 10
10, 4
4, 4
4 out of 10
5.
Co ten program wypisze na konsolę?
#include "stdio.h"

int main(void)
{
char *str = "HELLO WORLD";

str[5] = '_';
printf(str);

return 0;
}
HELLO WORLD
HELLO_WORLD
Nic, program zakończy się błędem
Zachowanie nie jest zdefiniowane
5 out of 10
6.
Co ten program wypisze na konsolę?
#include "stdio.h"

int main(void)
{
char str[] = "HELLO WORLD";

str[5] = '_';
printf(str);

return 0;
}
HELLO WORLD
HELLO_WORLD
Nic, program zakończy się błędem
Zachowanie nie jest zdefiniowane
6 out of 10
7.
Co ten program wypisze na konsolę?
#include "stdio.h"
#include "stdint.h"

int main(void)
{
uint32_t *ptr = 0x20000000;

ptr++;
printf("0x%08X", ptr);

return 0;
}
0x20000001
0x20000004
To zależy od architektury procesora
7 out of 10
8.
Co ten program wypisze na konsolę?
#include "stdio.h"
#include "stdint.h"

int main(void)
{
uint16_t *ptr1 = 0x20000000;
uint16_t *ptr2 = ptr1 * 2;

printf("0x%08X", ptr2);

return 0;
}
0x40000000
0x80000000
To zależy od architektury procesora
Nic - nastąpi błąd kompilacji
8 out of 10
9.
Co ten program wypisze na konsolę?
#include "stdio.h"

#define MAX(a, b) (((a) > (b)) ? (a) : (b))

int main(void)
{
int x = 5;
int y = 3;

printf("%d", MAX(x++, y++));

return 0;
}
5
3
6
4
9 out of 10
10.
Czy o ile zmienna data w obu plikach zostanie zainicjalizowana zerem zmieni się działanie programu?
Plik uart.c:
#include "stdint.h"
#include "processor_defines.h"

uint32_t data; //= 0;

void uart_read(void)
{
data = UART1->DR;
}

Plik spi.c:
#include "stdint.h"
#include "processor_defines.h"

uint32_t data; //= 0;

void spi_read(void)
{
data = SPI1->DR;
}
Nie, oba pliki będą dalej wykorzystywać tą samą zmienną.
Nie, oba pliki będą dalej wykorzystywać różne zmienne.
Tak, bez inicjalizacji oba pliki będą wykorzystywać tą samą zmienną, a z inicjalizacją różne.
Tak, po dodaniu inicjalizacji otrzymamy błąd kompilacji.
10 out of 10

Time is Up!

CancelSubmit Quiz

Time's up

Cancel
Idź do oryginalnego materiału