Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
из племени тумба-юбма
 Аватар для мама Стифлера
2492 / 1814 / 418
Регистрация: 29.11.2015
Сообщений: 8,815
Записей в блоге: 15
1

Откуда у некоторых переменных вместо значения НОЛЬ, присваивается другое значение?

15.10.2019, 12:16. Показов 4331. Ответов 50
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, нашел для себя вроде как не плохую и понятную книгу, по обучению Си https://www.kpolyakov.spb.ru/download/devcpp_1.pdf. Сразу в первых примерах на практике, столкнулся с непонятными значениями присвоения переменных.
Кликните здесь для просмотра всего текста

C++ Скопировано
1
2
3
4
5
6
7
#include <stdio.h>
main()
{
int a1, b1, c1, a2, b2, c2, x, y, z, n;
printf("Привет/Hello\n a1=%d\n b1=%d\n c1=%d\n a2=%d\n b2=%d\n c2=%d\n x=%d\n y=%d\n z=%d\n n=%d\n", a1, b1, c1, a2, b2, c2, x, y, z, n);
getchar();
}
Результат:
╧ЁштхЄ/Hello
a1=0
b1=1
c1=0
a2=0
b2=0
c2=40
x=0
y=0
z=0
n=4203673

Крякозябры кириллицы меня на данном этапе не интересуют. Интересуют сами значения переменных. Откуда у некоторых переменных вместо значения НОЛЬ, присваивается другое значение?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.10.2019, 12:16
Ответы с готовыми решениями:

Макрос: Eсли Х больше Y, то Z присваивается значение Х, в противном случае Z присваивается значение Y
Для проведения отладки макрокоманды составить программу, включающую макрообращение. Макрокоманда, аналогичная оператору IF в языке PL/M....

Нужно сделать чтобы при делении на ноль, выводило На ноль делить нельзя, введите другое число
Я сделал, на ноль то он не делит, но когда ввожу другие значение, то там тоже выводится Делить на ноль нельзя, хотя вводил вовсе не ноль...

Не получается корректно вывести значения некоторых переменных
Здравствуйте. Написал я код для работы с окнами Виндовс и у меня возникла проблема - не могу корректно вывести значения некоторых...

50
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
18.10.2019, 11:44 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это было бы заметным ударом по эффективности кода.
С чего бы это вдруг?
Недостатки очистки вызываемой стороной очевидны, но вот недостатков очистки вызывающей с ходу придумать не могу.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Во-вторых, при чем здесь вдруг вообще функции с переменным числом аргументов?
При том, что принцип работы всех функций один и тот же, естественно. Просто не примере функций с переменным числом аргументов и вызовом функции по указателю (где число и тип аргументов точно так же неизвестны) это механизм виден наиболее наглядно.

Добавлено через 9 минут
Покопался немного по стандарту:
An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
Если список аргументов не указан в определении функции, считается что она не принимает параметров. Если список аргументов не указан в прототипе, считается что параметры неизвестны.
.
И там же куча примеров конкретно с int main(), можете пробежаться поиском. Я насчитал 2 примера без списка параметров, 2 с пустым списком (void) и 1 с полным списком (argc, argv)
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12862 / 6727 / 1809
Регистрация: 18.10.2014
Сообщений: 17,029
18.10.2019, 12:05 42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С чего бы это вдруг?
Недостатки очистки вызываемой стороной очевидны, но вот недостатков очистки вызывающей с ходу придумать не могу.
Именно с того, что преимущества очистки параметров вызывающей стороной настолько существенны, что практически все аппаратные платформы заточены под такой вариант уже на аппаратном уровне. Стандарт языка С, разумеется, сформулирован в расчете на то, что реализации будут следовать именно этой эффективной технике кодогенерации.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
При том, что принцип работы всех функций один и тот же, естественно. Просто не примере функций с переменным числом аргументов и вызовом функции по указателю (где число и тип аргументов точно так же неизвестны) это механизм виден наиболее наглядно.
Естественно нет. "Принцип работы" функций с переменным числом параметров не имеет ничего общего с "принципом работы" обычных функций. Это вы можете увидеть и в любом ABI, и это отражено и в том факте, что стандарт языка С во все века и времена требовал предварительного объявления функций с переменным числом параметров. Именно потому, что такие функции не имеют ничего общего с обычными функциями. Функции с переменным числом параметров всегда были сущностями особого рода.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если список аргументов не указан в определении функции, считается что она не принимает параметров.
Имеется в виду, что с точки зрения тела этой функции, параметров у нее нет. С точки зрения объявления, которое вводится таким определением, параметры неспецифицированы. То есть никакой разницы в этом отношении между объявлением и определением нет. Вопрос этот давно разъяснен и закрыт: http://www.open-std.org/jtc1/s... dr_317.htm

Можно даже делать рекурсивный "неправильный" вызов такой функции из самой себя

C Скопировано
1
2
3
4
void foo()
{
  foo(1, 2, 3);
}
Код валиден с точки зрения С, хоть поведение и не определено.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если список аргументов не указан в прототипе, считается что параметры неизвестны.
Выражение "список аргументов не указан в прототипе" - оксиморон. Если в прототипе "не указан список аргументов", то это никак не прототип.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И там же куча примеров конкретно с int main(), можете пробежаться поиском. Я насчитал 2 примера без списка параметров, 2 с пустым списком (void) и 1 с полным списком (argc, argv)
Это совсем не важно, что там в примерах. Мой совет избегать объявлений с () основан только на том, что все K&R объявления официально являются obsolescent, то есть находятся в процессе удаления из языка. Это удаление еще не произошло.
0
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
18.10.2019, 12:35 43
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Именно с того, что преимущества очистки параметров вызывающей стороной настолько существенны
Вы повторили то, что я сказал: после вызова функции стек и все прочее чистит вызывающая сторона. Следовательно, если вызываемая сознательно его не портит, никакого UB и не будет. А смысл тогда был спорить?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Естественно нет. <набор слов без аргументации поскипан>
Так отличия-то найдете?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Код валиден с точки зрения С, хоть поведение и не определено.
Вполне определено - бесконечная рекурсия.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если в прототипе "не указан список аргументов", то это никак не прототип.
А что?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это удаление еще не произошло.
И вряд ли произойдет, поскольку единственное, что оно делает - ломает совместимость и снижает читаемость. Ни на безопасности, ни на предсказуемости кода это не скажется.
В лучшем случае снимут кальку с С++, где отсутствие списка аргументов эквивалентно пустому списку. Тем более что на практике оно почти всегда так и используется.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12862 / 6727 / 1809
Регистрация: 18.10.2014
Сообщений: 17,029
18.10.2019, 12:55 44
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы повторили то, что я сказал: после вызова функции стек и все прочее чистит вызывающая сторона. Следовательно, если вызываемая сознательно его не портит, никакого UB и не будет. А смысл тогда был спорить?
Нет, просто опечатался. Речь, разумеется, шла об очистке стека вызываемой строной. И спора тут н какого нет - я лишь констатирую факты.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вполне определено - бесконечная рекурсия.
Нет, конечно, первый же вызов с неправильным количеством параметров - неопределенное поведение. Ни до какой "бесконечной рекурсии" дело тут дойти не успевает.

Вы уж определитесь, о чем вы говорите: о собственных "мечтах" по поводу языка С или о реальном стандартном языке. А то у вас то чтение стандарта начинается, то собственные выдумки, то снова чтение стандарта, то снова выдумки...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А что?
Объявление без прототипа, что же еще? По-моему эти азы языка тут уже много раз тут разжевывались, в том числе мной.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И вряд ли произойдет, поскольку единственное, что оно делает - ломает совместимость и снижает читаемость. Ни на безопасности, ни на предсказуемости кода это не скажется.
Ломает совместимость, но астрономическиски повышает читаемость и существенно повышает безопасность. А "произойдет" или "не произойдет" - это дело десятое. Просто не нужно пользоваться deprecated свойствами языка. А уж когда их удалят и удалят ли вообще - не важно.
0
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
18.10.2019, 15:06 45
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Речь, разумеется, шла об очистке стека вызываемой строной.
Которая, очевидно, сложнее и опаснее, чем вызывающей. Что дальше?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ни до какой "бесконечной рекурсии" дело тут дойти не успевает.
А если подумать? А если проверить?
Кликните здесь для просмотра всего текста

Если подумать: вызывающая сторона заполняет стек и регистры, после чего вызывает функцию, дожидается ее завершения и сбрасывает указатель стека обратно. Вызываемая функция считает, что параметров ей не положено, поэтому содержимое стека просто игнорирует. Поведение вполне безопасное и предсказуемое.
Если проверить:
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ cat main.c
#include <stdio.h>
 
void foo(){
  static int cnt=0;
  printf("%i\n", cnt++);
  foo(1, 2, 3);
}
 
int main(){
  foo();
}
$ gcc main.c
$ ./a.out
<...>
523827
523828
523829
523830
523831
523832
523833
523834
523835
523836
523837
523838
523839
523840
Ошибка сегментирования
Как и следовало ожидать: код собрался, запустился и вылетел по переполнению стека из-за бесконечной рекурсии

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Объявление без прототипа, что же еще?
А, то есть вот это int func(); уже объявление без прототипа. И давно?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ломает совместимость, но астрономическиски повышает читаемость и существенно повышает безопасность.
Ломает совместимость, немного снижает читаемость и не влияет на безопасность. А, собственно, ради чего?
.
Вы приводите какие-то свои домыслы, не подкрепленные ничем: ни логикой, ни цитатами из стандарта, ни конкретными примерами, демонстрирующими то или иное поведение. Может, все-таки перейдете к конструктиву?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12862 / 6727 / 1809
Регистрация: 18.10.2014
Сообщений: 17,029
18.10.2019, 17:38 46
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А если подумать?
Не понял. О чем именно "подумать"? Не пошутили ли авторы стандарта?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А если проверить? ... Как и следовало ожидать: код собрался, запустился и вылетел по переполнению стека из-за бесконечной рекурсии
"Проверить" что? "Проверить" неопределенное поведение???

Простите, это троллинг или вам просто нечего делать? Пожалуйста, не оскорбляйте присутствующих таким апофеозом вопиющего идиотизма, как попытки "проверять" неопределенное поведение практическими примерами или "подкреплять" тут что-то ими.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А, то есть вот это int func(); уже объявление без прототипа. И давно?
Да, конечно! Это именно объявление без прототипа. И не "уже", а всегда было! Похоже, начинать нужно именно с таких азов.

А давно ли... С того момента, как в языке появились прототипы, то есть С первого стандарта языка С. 1989 год. Вы действительно не знаете, когда появился стандарт языка?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вы приводите какие-то свои домыслы, не подкрепленные ничем: ни логикой, ни цитатами из стандарта, ни конкретными примерами, демонстрирующими то или иное поведение. Может, все-таки перейдете к конструктиву?
Все мои утверждения подтверждены стандартом языка и ссылки на него я здесь не раз уже приводил. Если вам не понятен какой раздел стандарта описывает какой из вышеупомянутых моментов - спрашивайте
0
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
19.10.2019, 09:12 47
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Проверить" что? "Проверить" неопределенное поведение???
Проверить ваше утверждение:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, конечно, первый же вызов с неправильным количеством параметров - неопределенное поведение. Ни до какой "бесконечной рекурсии" дело тут дойти не успевает.
И стандарт, и логика, и эксперимент подтверждает, что вызов такой функции прекрасно работает. Я хотел сказать, что код совершенно исправен, но бесконечная рекурсия не позволяет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Да, конечно! Это именно объявление без прототипа.
То есть у функции будет два определения. А зачем тогда, по-вашему, вводили термин "прототип"?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Все мои утверждения подтверждены стандартом языка и ссылки на него я здесь не раз уже приводил. Если вам не понятен какой раздел стандарта описывает какой из вышеупомянутых моментов - спрашивайте
Ссылок на стандарт в этой теме не было вообще. Самое близкое - моя цитата и предложение поискать в стандарте примеры, но без номера называть прямо "ссылкой" слишком сильно.
Если у вас есть ссылки, где указывается, что передача в функцию, объявленной без аргументов, чего-то другого, будет UB, приводите, конечно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12862 / 6727 / 1809
Регистрация: 18.10.2014
Сообщений: 17,029
19.10.2019, 10:38 48
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И стандарт, и логика, и эксперимент подтверждает, что вызов такой функции прекрасно работает. Я хотел сказать, что код совершенно исправен, но бесконечная рекурсия не позволяет.
Ну зачем же впрямую врать? Стандарт открытым текстом говорит, что вызов функции с неправильным числом аргументов вызывает неопределенное поведение. Логика такого решения ясна и прозрачна.

От того, что вы будете непрерывно дылдонить обратное, ситуация не поменяется. И ваши попытки "опровергнуть" неопределенные поведение каким-то частными примерами вызывают лишь улыбку.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть у функции будет два определения.
Чего? Какие еще "два определения"?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А зачем тогда, по-вашему, вводили термин "прототип"?
В языке С исторически поддерживается два взаимоисключающих синтаксиса объявления (и определения) функции: K&R синтаксис (объявление без прототипа) и новый синтаксис, похожий на С++-объявления (объявление с прототипом).

Объявления второго типа - с прототипом - часто называют просто прототипами. Объявления первого типа "прототипами" никто никогда не называет. Кроме безграмотных "пионэров", разумеется.

А ввели объявления с прототипом (и термин "прототип") в стандартизованный язык потому, что K&R-синтаксис не накладывает на вызов функции никаких компиляторных проверок и ограничений, и посему опасен, крив и неудобен. А вот базовая корректность вызовов функций с прототипами прекрасно проверяется компилятором, а также позволяет компилятору проводить неявные преобразования типов аргументов к типам параметров.

Вызов функции, объявленной без прототипа, с неправильным числом и типами аргументов является неопределенным поведением:

http://port70.net/~nsz/c/c11/n1570.html#6.5.2.2p6

"If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. If the number of arguments does not equal the number of parameters, the behavior is undefined.[...]If the function is defined with a type that does not include a prototype, and the types of the arguments after promotion are not compatible with those of the parameters after promotion, the behavior is undefined, except for the following cases:

- one promoted type is a signed integer type, the other promoted type is the corresponding unsigned integer type, and the value is representable in both types;
- both types are pointers to qualified or unqualified versions of a character type or void."

Вызов функции, объявленной с прототипом, с неправильным числом и типами аргументов является некорректным кодом (т.е. "ошибкой компиляции"):

http://port70.net/~nsz/c/c11/n1570.html#6.5.2.2p2

"If the expression that denotes the called function has a type that includes a prototype, the number of arguments shall agree with the number of parameters. Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter."

У людей, слабо знакомых с тонкостями языка, может вызывать с затруднение определение принадлежности объявлений с () - это старое K&R-объявление или прототип? Для человека, знакомого со стандартом языка, ответ очевиден - это K&R-объявление, что и иллюстрируется нашими экспериментами.

Я вам выше также дал ссылку на разъяснения комитета по стандартизации по поводу определений функции с (), где ясно сказано, что несмотря на фразу "у функции нет параметров" в тексте стандарта, такое определение все равно не вводит прототипа, то есть не фиксирует количество и типы параметров.
0
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
19.10.2019, 20:54 49
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
вызов функции с неправильным числом аргументов
Не вызов, а использование. А в примере использования как раз нет.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
От того, что вы будете непрерывно дылдонить обратное, ситуация не поменяется.
Да вот и чувствую, что хоть об стенку стучись. Механизм возможного UB вы так и не привели, реальных примеров тоже. Единственное что было - намек в стандарте, который не полностью соответствует задаче.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12862 / 6727 / 1809
Регистрация: 18.10.2014
Сообщений: 17,029
20.10.2019, 00:57 50
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не вызов, а использование. А в примере использования как раз нет.
Чего???

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
[...]Механизм возможного UB[...]реальных примеро[...]стандарте, который не полностью соответствует задаче.
На весь этот поток чуши я уже отвечал выше. Я думаю, народ, что тут бесполезно дальше тратить время.
0
 Аватар для COKPOWEHEU
4043 / 2590 / 431
Регистрация: 09.09.2017
Сообщений: 11,553
20.10.2019, 14:04 51
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я думаю, народ, что тут бесполезно дальше тратить время.
да тут на вашу чушь все равно кроме меня никто времени не тратит, не переживайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2019, 14:04
Помогаю со студенческими работами здесь

Значение присваивается переменной, но не присваивается TexBox
есть функция public static void ControllerInfo(string name, ref string customer, ref int addres) которая возвращяет ссылку на переменную,...

Всем элементам массива присваивается ноль
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int type, i; int * a; printf (&quot;Please, choose the...

Если значения переменных не равны, то присвоить им максимальное из значений, иначе присвоить им ноль
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной максимальное из этих значений, а если...

Как вставить, вместо огромного ряда переменных, значения из массива в updateTable?
Ребят в Java я еще довольно плохо разбираюсь. Как вставить, вместо огромного ряда переменных, значения из массива в updateTable? ...

Как сделать чтоб во время работы программы при нажатии определенных клавиш изменялось значение некоторых переменных?
Как сделать чтоб во время работы программы при нажатии определенных клавиш на клавиатуре изменялось значение некоторых переменных? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Простая нейросеть на КуМир: Создание и обучение
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
Исполнитель Водолей в КуМир: Решение задач
EggHead 16.03.2025
Разработка алгоритмического мышления — одна из ключевых задач для начинающих программистов, и система КуМир предлагает отличный способ погрузиться в этот процесс. Среди множества исполнителей в этой. . .
Исполнитель Чертежник в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы можете рисовать на бесконечной координатной плоскости, перемещая точку, которая оставляет след. По вашей команде она может поднять перо и двигаться, не оставляя следа, или. . .
Исполнитель Робот в КуМир: Решение задач
EggHead 16.03.2025
КуМир (Комплект Учебных МИРов) — это учебная среда программирования, разработанная специально для обучения базовым концепциям алгоритмизации. Её главная фишка — использование русскоязычного. . .
Исполнитель Черепаха в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы впервые учитесь программировать, а перед вами стоит задача заставить маленькую виртуальную черепашку рисовать на экране. Звучит забавно? Эта идея зародилась ещё в 1967 году, когда. . .
Конвейеры данных с Apache Kafka
Javaican 16.03.2025
В мире, где данные стали новой нефтью, Apache Kafka зарекомендовал себя как мощный инструмент для построения надежных и масштабируемых конвейеров данных. Созданный изначально командой LinkedIn в 2011. . .
Deno против Node.js: Будущее JavaScript рантайма
run.dev 16.03.2025
За последнее десятилетие Node. js стал абсолютным лидером среди JavaScript-рантаймов и фактическим стандартом для серверной разработки на JavaScript. Но в 2018 году тот же разработчик, который создал. . .
SwiftUI или UIKit - что выбрать для нового приложения iOS?
mobDevWorks 16.03.2025
Когда Apple представила SwiftUI на WWDC 2019, многим показалось, что дни UIKit сочтены. Новый декларативный фреймворк предлагал радикально иной подход к разработке интерфейсов. Вместо кропотливого. . .
Docker: Руководство для начинающих по созданию первого приложения
Mr. Docker 16.03.2025
Docker — это платформа, которая упаковывает ваше приложение и все его зависимости в стандартизированные блоки, называемые контейнерами. Эти контейнеры изолированы друг от друга и от основной системы,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер