Архив метки: C

Язык C — узнаем размер массива без шуму и пыли без sizeof

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

Задача: нужно узнать длину массива, но без sizeof, ибо будем считать, что мы одни на планете и на все написанные ранее библиотеки «поклали прибор».

#include <stdio.h>

int main(void) {

//наш массивчик
int left[] = {2,67,89,200,100,100};

//узнаем размер массива без функции sizeof
int size = *(&left + 1) - left;
    printf("%d\n", size);    
  return 0;
}

Здесь следующее:

&left - указатель на массив из 6 элементов
(&left + 1) - адрес на 6 целых чисел - указатель на массив из 6 целых чисел
*(&left + 1) - тот же адрес, что и (&left + 1) , но тип указателя int *

Понятно что нифига асболютно не понятно. Что тут происходит подробно напишу позже.

Запись опубликована автором в рубрике С с метками .

C — диапазон случайных чисел от 10 до -10

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>

int main() { 
int tmp = 10;

 for (int i = 0; i < 20; i++){
     
      printf( "Cлучайное для числа %d из диапазона -10 до 10 = %d\n", tmp--, rand() % 21 + (-10));
 }
return 0; 
}

Что происходит именно в

rand() % 21 + (-10)

функция rand() выдаёт значение от 0 до 2^15 - 1 (32767)

rand() % 21 вычисляет остаток от деления полученного случайного числа на 21 (т.е. от 0 до 20).

поскольку остатки цикличны таким образом реализуется генерация случайного числа от 0 до 20 включительно

+ (-10) смещает случайное число влево на 10, т.е. вместо случайного числа в диапазоне 0..20 получается случайное число в диапазоне -10..10