Показать полную графическую версию : Помогите в изучении C.
Efimalex
03-02-2014, 23:16
Добрый вечер. Решил я попытаться освоить программирование, решил начать с C. До этого с программированием дела не имел ( школьный курс Basic не в счет ). Читаю книгу Д. Ритчи & Керниган Б. Язык программирования С., поставил Eclipse, компиляторы MinGW. Начал писать, а вернее списывать:), свою первую программу. Текст программы взят из книги.
#include <stdio.h>
main()
{
printf("Hello, world\n");
}
eclipse после компиляции выдавал две ошибки, хотя и запускал программу. Они пропали после того как текст изменил на
#include <stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
Этот текст я взял в инете. Объясните в чем разница? Что такое int я разобрался, но зачем в данной программе нужно указывать тип функции? И про return 0
eclipse после компиляции выдавал две ошибки, хотя и запускал программу. »
Не ошибки, а предупреждения (warning). Это просто указание на места в коде, которые хоть и являются синтаксически допустимыми, но кажутся компилятору странными или не соответствуют стандарту. Их можно не исправлять, если вы уверены, что они не приведут к ошибкам.
Скорее всего у вас используется компилятор C++, а не C. В стандарте С++ есть требование, что функция main должна возвращать целочисленный код завершения. return 0, в данном случае означает, что программа при успешном завершении передает операционной системе код завершения 0. Обычно код завершения 0 означает успешное завершение программы, другими значениями обозначают аварийное завершение.
Объясните в чем разница? »
В настройках компилятора?
#include <stdio.h>
main()
{
printf("Hello, world\n");
}
У меня в среде Dev-C++ ошибок не наблюдается.
Efimalex, если кратко, то Большая разница: int main() или void main()? (http://it-blog1.blogspot.ru/2011/12/int-main-void-main.html)
return 0 - возвращает ноль компилятору, свидетельствуя о том, что функция (программа) завершена правильно.
Иностранные источники:
stackoverflow.com What is the proper declaration of main (http://stackoverflow.com/questions/4207134/what-is-the-proper-declaration-of-main)
msdn.microsoft.com Main() Return Values (C# Programming Guide) (http://msdn.microsoft.com/en-us/library/0fwzzxz2.aspx)
stackoverflow.com What should main return in c and c (http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c)
lxa85, тут что-то всё в кучу — и C, и C++, и C#.
return 0 - возвращает ноль компилятору »
Может быть операционной системе?
torauma, может и операционной системе, не знаю. :)
Главное куда-то "вышестоящей системе", которая примет решение о дальней судьбе программы.
Операционной системы... Нашел.
Есть такая любопытная вещь OSv (http://osv.io/). (Краткая справка на opennet.ru (http://www.opennet.ru/opennews/art.shtml?num=37936))
Там куда 0 возвращается, тоже в операционную систему?
Или она там такая "тонкая", что почти как гипервизор? :)
Iska, на msdn явное упоминание С++ на нашел, т.к. С++ и С# языки родственные + на stackoverflow попадаются вырезки из стандартов, оставил.
lxa85, не знаю как там OSv устроена, но в Линуксе и Винде, если я правильно помню, передается родительскому процессу. А передачей информации между процессами вроде как ОС занимается.
Точно могу сказать, что код завершения компилятору не передается, т.к. к моменту его передачи компилятор все свои задачи уже выполнил.
Точно могу сказать, что код завершения компилятору не передается, т.к. к моменту его передачи компилятор все свои задачи уже выполнил. »
Или все таки компилятору? :)
Нет, в целом я согласен, что моя формилировка вызывает вопросы, просто спортивный интерес.
AFAIK программы написанные в среде .Net в строгом смысле не являются непосредственно исполняемыми на процессоре. Они находятся в некотором промежуточном коде, и исполняются компилятором "на лету". Т.е. компилируя программу в .NET мы получаем переносимый код. А его исполнение зависит от оболочки на каждой конкретной архитектуре. По смыслу очень похоже на технологию Java.
Efimalex
04-02-2014, 22:50
Спасибо, с этим вроде разобрался. Если что компилятор ставил как тут написано http://www3.ntu.edu.sg/home/ehchua/programming/howto/Cygwin_HowTo.html#mingw
lxa85, c .NET я не сталкивался, а Java компилируется в байткод, который потом выполняется на специальной виртуальной машине JVM. Согласитесь, javac никаких кодов завершения не получает, т.к. в выполнении программы не участвует.
Efimalex
05-02-2014, 22:35
Итак, добрался я до следующей программы:
#include <stdio.h>
/* печать таблицы температур по Фаренгейту
и Цельсию для fahr = 0, 20, ..., 300 */
main()
{
int fahr, celsius;
int lower, upper, step;
lower = 0; /* нижняя граница таблицы температур */
upper = 300; /* верхняя граница */
step = 20; /* шаг */
fahr = lower;
while (fahr <= upper) {
celsius = 5 * (fahr-32) / 9;
printf(“%d\t%d\n”, fahr, celsius);
fahr = fahr + step;
}
}
Поясните пожалуйста вот эти две строчки
int fahr, celsius;
int lower, upper, step;
Я правильно понял, что переменные нужно "раскладывать" раскладывать по типам? И непонятно с формулой, вернее с объяснением
Причина, по которой мы сначала умножаем на 5 и затем делим на 9, а не сразу умножаем на 5/9, связана с тем, что в Си, как и во многих других языках, деление целых сопровождается отбрасыванием, т. е. потерей дробной части. Так как 5 и 9 - целые, отбрасывание в 5/9 дало бы нуль, и на месте температур по Цельсию были бы напечатаны нули.
Может мне другими словами это разъясните? Ни как я не пойму этого отбрасывания. Может на конкретном примере покажете что происходит?
Может мне другими словами это разъясните? Ни как я не пойму этого отбрасывания. Может на конкретном примере покажете что происходит? »
С этим: Представление целых чисел - Поиск в Google (https://www.google.ru/search?q=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5+%D1%86%D0%B5 %D0%BB%D1%8B%D1%85+%D1%87%D0%B8%D1%81%D0%B5%D0%BB) Вы знакомы?
Что получится при обычном делении 5 на 9? «0.5(5)» — «0.5555555555555555555555555555555…». Операция деления над двумя целыми числами даёт целочисленный результат, т.е. вся дробная часть — «.5555555555555555555555555555555…» просто теряется, остаётся только «0». При делении 10 на 9 будет 1 («1.1111111111111111111111111111111»), 20/3 = 6 («6.6666666666666666666666666666667»).
Efimalex
06-02-2014, 22:01
В упражнении нужно переделать программу наоборот. Вот что получилось
#include <stdio.h>
/*печать таблицы температур по Фаренгейту
и Цельсию
*/
int main()
{
printf("Таблица температур\n");
float fahr, celsius;
float lower, upper, step;
lower=-17.8; /*нижняя граница температур*/
upper=300.0; /*верхняя граница температур*/
step=20.0; /*шаг*/
celsius=lower;
while (fahr<=upper)
{
fahr=(9.0/5.0*celsius+32.0);
printf("%5.1f %8.2f\n%" , celsius, fahr);
celsius=celsius+step;
}
return 0;
}
Пока строчка вывода результата вычеслений выглядела
printf("%5.1f %8.1f\n%" , celsius, fahr);
Программа выводила такие числа например, 162.2 323.0 (по Цельсию и Фаренгейту соответственно).
Когда указал в спецификации что выводить нужно с точностью до сотых, начала выводить нормально, 162,2 323,96. Это что, шло округление? Я думаю, не должно, ведь он должен просто откинуть все что идет после десятых долей, или я не прав?
Это что, шло округление? »Оно самое почитайте например, здесь (http://forum.vingrad.ru/forum/topic-236923/0.html).
Efimalex
30-11-2014, 21:47
Добрый вечер. Помогите разобраться вот в чем. Поставил на другой ноут(Win7 x86) Eclipse и MinGW. При запуске Build, создается лишь папка Debug, а бинарный фал нет. Но если использовать готовый проект Hello World ANSI C Project с кодом:
============================================================================
Name : hr.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
return EXIT_SUCCESS;
}
то все проходит нормально. Но если создавать свой проект с кодом
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
то при запуске Build, в консоли выводится следующее: Info: Internal Builder is used for build
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o h.o "..\\h.c"
gcc -o hk.exe h.o
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
22:55:18 Build Finished (took 1s.715ms)
alef2474
01-12-2014, 00:56
Если что компилятор ставил как тут написано http://www3.ntu.edu.sg/home/ehchua/p...wTo.html#mingw »
Я, конечно, не программист и пусть меня не бьют ногами за это.
Но, имхо, изучать С(а не C#) на базе допотопных средств из 1980-х годов на сегодня негоже (это на совести старых авторов (Ритчи и т.п.), читающих многолетние курсы для профессионалов, для таких случаев можно и так).
Нужно поставить какую-нибудь версию MSVisualStudio из современных и изучать программирование, исходя из ее особенностей, интерфейса,
потому что все это изучение нужно для возможности в перспективе создать что-то современно-полезное, а не просто сдать экзамен по началам С и забыть надолго.
Примерно так http://msdn.microsoft.com/ru-ru/library/k1sx6ed2.aspx (У меня без всяких вопросов все сразу заработало)
Иначе неизбежно будут горы ненужных для изучения проблем в разных версиях, которые в последнем вопросе.
Можно там в Studio обыгрывать примерчики с фаренгейтами из Ритчи.
alef2474, можете пояснить — с какого перепуга MinGW и Eclipse в Ваших устах превратились в «допотопные средства из 1980-х годов»?
alef2474
01-12-2014, 10:25
с какого перепуга MinGW и Eclipse »
Да, Википедия говорит о 1998 годе, но начало было положено раньше в 1985-ом https://ru.wikipedia.org/wiki/GNU_Compiler_Collection.
В любом случае, имхо, это несовременно изучать отмирающие версии языка и старые грабли версий для новичка, в моей ссылке на MS, кстати отвечены варианты написания main() Управление памятью значительно усовершенствовано в C# по сравнению с C++ Имхо, нужно изучать не только язык, но и нормальную среду программирования, а не что-то минималисткое, вызывающее вопросы.
Если я неправ, объясните в чем.
Вы ответите про return EXIT_SUCCESS; и stdlib из последнего вопроса?
Если я неправ, объясните в чем. »
В азарте. Язык — всего лишь инструмент. Не надо делать из него фетиш. Кто-то пишет на стандартном C, кто-то — на C++. Кто-то жить не может без C#, а кому-то хватает и пакетных файлов. Апологеты чистого ассемблера их запросто заклюют за «неправильный», с их точки зрения, подход.
Вы ответите про return EXIT_SUCCESS; и stdlib из последнего вопроса? »
Нет, конечно. У меня нет MinGW.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.