Ребёнок программирует.

Discussion in 'WASM.BEGINNERS' started by Minzdrav, Sep 12, 2018.

  1. Minzdrav

    Minzdrav Well-Known Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2017
    Messages:
    1,082
    Уважаемые специалисты, помогите ребёнку разобраться:

    1. Что такое void? И зачем он нужен.

    2. Зачем int перед main?

    Вот ребёнок пишет:
    main ()
    int main ()
    int main (void)

    Во всех случаях работает одинаково. Но умный дядя ругался,
    что ребёнок пишет main (), вместо int main (void).
    А когда ребёнок спросил, - почему? Дядя ничего объяснить не смог, кроме
    каких-то спецификаторов типа, и других умных слов.

    Ребёнок долго читал Википедию, но ни х__ не понял.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Шлите дядю нах. Можно писать как угодно.
    Вот только первый вариант на некоторых компиляторах при компиляции С++ стандарта (не чистый С) - работать не будет.
    Второй вариант верный. Означает что функция не имеет параметров. возвращает тип Int. Внутрь void можно не ставить. Это глупость.
    теперь по вопросам
    1) void - в основном придуман, чтоб иметь возможность делать указатели, не привязанные к определенному типу. Например void* data. Так же его можно использовать в возвращаемым значением функции - void main() это говорит о том, что функция не возвращает значения. Если рассмотреть вариант int main(void) то это эквивалентно int main() .

    2) любой тип перед именем функции говорит о возвращаемом значении. Однако в чистом С (ранних стандартах) если не указан тип, то считается что возвращается int. Современные компиляторы на такое дадут отлуп. Да и вообще это палки в колеса. Нужно строго контролировать возвращаемое значение.
     
    Minzdrav likes this.
  3. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    Мариванна, вам по учебнику или как на самом деле было? От него сейчас нужна способность усваивать материал, пусть хотя бы как сказано делать научится. Кому надо повторять несколько раз, чтобы поняли? Дэбилам и дэбилам, считающим себя умней всех.
     
  4. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    это нормально, даже хорошо, если это отвлекает его от греховных мыслей... ведь библия не приветствует мастурбацию... даж онанизм был назван в честь Онана, сына Иуды... пусть лучше занимается программированием, чем плотскими утехами с самим собой...
     
  5. UbIvItS

    UbIvItS Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2007
    Messages:
    6,242
    Minzdrav, не понял я маленько юмора.. акий ребёнок ??? Ты сам прогать хочешь начать? ежель так, то говори прямо, что хочешь заняться сией глупостью :grin:
    с аких пор программирование отвлекает от греховных мыслей? :)
     
  6. UbIvItS

    UbIvItS Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2007
    Messages:
    6,242
  7. SadKo

    SadKo Владимир Садовников

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Самое полное определение main:
    Code (Text):
    1.  
    2. int main(int argc, const char **argv)
    3.  
    Функция возвращает значение типа int, которое впоследствии может быть проанализировано вызывающей программой (например, командной оболочкой). Принято, что в случае успешного выполнения программы функция main должна вернуть значение 0, а в случае ошибки - любое отличное от этого значение.
    argc - количество аргументов, передаваемых в программу.
    argv - указатель на начало массива Си-строк с перечнем аргументов, при этом нулевой аргумент всегда содержит имя файла вызываемой программы.
    Иными словами, программу можно вызвать из командной оболочки и передать аргументы, например так:
    Code (Text):
    1.  
    2. mount -t ext2 /dev/sd0 /mnt
    3.  
    В этом случае argc будет равен 5, а argv будет состоять из 5 элементов - "mount", "-t", "ext2", "/dev/sd0", "/mnt".
     
    Minzdrav and _edge like this.
  8. UbIvItS

    UbIvItS Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2007
    Messages:
    6,242
    кстати, вопрос не по теме: ты используешь древнюю ext2 ???
     
  9. SadKo

    SadKo Владимир Садовников

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Если только на /boot-разделе. Сейчас либо ext4, либо xfs.
     
  10. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    Minzdrav,

    Могли бы и просто задать вопрос, зачем придумывать ребёнка. Это ведь ничего не меняет.

    TermoSINteZ,

    > int main(void) то это эквивалентно int main() .

    Компиляторные фишки. Обычно используется PVOID как указатель на не определённую структуру. Сам же VOID это не ясно зачем нужно, это не нужный в языке компонент. Функция в любом случае вернёт значение, возможно оно дальше использоваться не будет, но зачем это помечать спец маркером, язык должен быть интерактивен, а не примитивен, что бы всякие мелочи описывать не нужные.
     
  11. skales007

    skales007 Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2018
    Messages:
    37
    Не совсем понял, почему обязательно вернёт? Понимаю что void может быть лишним, но функция же не обязана что-то возвращать. Мне вот лично с void было нагляднее. Единственное, что смущало, это void* - первое время не понимал (хоть и по глупости).
     
  12. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    skales007,

    Физически функция возвращает управление, просто в каком то конкретном случае значение не определено и есть тот самый войд. Это всё скриптовые конструкции, нужно помнить что скрипт лишь способ описания, он выполняется каким то образом и значение возвращаемое есть всегда.
     
  13. skales007

    skales007 Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2018
    Messages:
    37
    Indy_, действительно, даже не подумал, что значение в любом случае каким нибудь да будет. Тогда все встанет на свои места и, на мой взгляд void тем более нужен, чтоб не лезли куда не нужно. Но скорее всего это будет полезно в начале изучения, т.к. опытному программисту этого обьяснять не нужно)
     
  14. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    skales007,

    Опытные используют типизацию всегда. Если это указатель, то он определяется не по размеру, а по типу pvoid. Так код становится читаем. Глупый кодер определит не тип, либо их вообще не использует, а размер параметра.
     
    UbIvItS and skales007 like this.
  15. UbIvItS

    UbIvItS Well-Known Member

    Blog Posts:
    0
    Joined:
    Jan 5, 2007
    Messages:
    6,242
    да, языки программирования без жёсткой типизации есмь Зло. Но в силу их удобства для мелких задач они получили широкое распространение, а теперь сие Безобразие имеет место быть и в крупных проектах :)
     
  16. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    вы, друзья, еще хаскелл не видели, где каждая функция обязана что-то возвращать, игнорировать возвращенное значение нельзя, нет сайд-эффектов, а следовательно нет циклов, есть только рекурсия и всяческие монады, моноиды и тд, и структуры данных константные... после императивных языков программирования функциональные кажутся полной жестью...
     
    UbIvItS likes this.
  17. f13nd

    f13nd Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 22, 2009
    Messages:
    2,020
    Это один из тех языков, который был придуман чтобы зарабатывать на обучении ему?
     
    _edge likes this.
  18. Rel

    Rel Well-Known Member

    Blog Posts:
    2
    Joined:
    Dec 11, 2008
    Messages:
    5,317
    ну лично мне кажется, что Хаскелл был придуман для всяческого математического задротства, чтобы программисты и математики с маленькими писюнами могли выделываться, программируя на нем... но есть вполне практичные функциональные языки программирования, как например Окамл, Фшарп или Елм... хотя в них само собой есть способы нагибать функциональщину за счет старого доброго императивного или объектно-ориентированного программирования, они не чисто функциональные, как Хаскелл...
     
  19. Minzdrav

    Minzdrav Well-Known Member

    Blog Posts:
    0
    Joined:
    Mar 21, 2017
    Messages:
    1,082
    Все мы дети Божьи...
     
  20. SadKo

    SadKo Владимир Садовников

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    А как вообще, удобно функциональный код дебажится? А то мне при дебаге лямбд в Java убивать хочется всех, кто эти лямбды придумал.