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.
1 out of 10
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;
}
#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
2.
2 out of 10
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;
}
#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
3.
3 out of 10
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;
}
#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
4.
4 out of 10
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;
}
#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
5.
5 out of 10
Co ten program wypisze na konsolę?
#include "stdio.h"
int main(void)
{
char *str = "HELLO WORLD";
str[5] = '_';
printf(str);
return 0;
}
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.
6 out of 10
Co ten program wypisze na konsolę?
#include "stdio.h"
int main(void)
{
char str[] = "HELLO WORLD";
str[5] = '_';
printf(str);
return 0;
}
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
7.
7 out of 10
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;
}
#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
8.
8 out of 10
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;
}
#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
9.
9 out of 10
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;
}
#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
10.
10 out of 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;
}
#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.
Time is Up!
Time's up