Почему GtkCalendar считает месяцы с 0?

Итак, я провел несколько часов в ярости, выясняя, почему мой код записывает в /sys/class/rtc/rtc0/wakealarm правильно. Проблема в том, что он ничего не возвращает, если значение неверно. И наконец я заметил это маленькое

5

между годом и днем. Почему он не считает дни и годы с нуля для согласованности?

Для сравнения: QCalendarWidget считает месяц от 1 до 12 ( документов )

2
задан 27 June 2012 в 08:24

13 ответов

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 25 July 2018 в 18:18

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 2 August 2018 в 00:31

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 4 August 2018 в 15:59

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 6 August 2018 в 00:38

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 7 August 2018 в 18:04

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 10 August 2018 в 06:51

Это целое обсуждение, включающее или исключающее. Вероятно, они использовали систему для подсчета количества прошедших месяцев.

Например, если вы скажете, что прошел 1 месяц, вы окажетесь во втором месяце года. , Поэтому, если вам нужна программа для подсчета количества прошедших месяцев, и вы используете систему 1-12, она сообщит, что вы находитесь в месяце 1 (январь), а не в том, что прошло 0 (январь) месяцев, и вам необходимо выполнить преформу дополнительная функция для определения того, сколько времени прошло.

Так же, как в мысли-головоломке в Chrono Trigger, http://www.youtube.com/watch?v=Ll1uAla90BU&t=13m42s , в зависимости от того, как вы рассчитываете, подсчитываете ли вы с начала или подсчитываете, когда заканчиваете, это может быть невероятно обманчивым. enter image description here [/g1]

Так что для кодирования легче начать с 0, на диаграмме вы считаете до трех, но на первом рисунке это всего лишь 2 полных цикла (месяца) и в в секунду, когда вы считаете до 3, но начинаете с 0, добавляя до 3 полных месяцев.

Так же каждый подсчитывает, сколько им лет, вы начинаете с 0 и переходите к 1 после того, как год прошел .

Что же касается того, почему они не делали этого в течение многих дней и лет. Я полагаю, что подсчет по дням раздельный из-за разного количества дней в месяце, это также затруднило бы подсчет того, сколько месяцев прошло, если вы идете по количеству дней. и вы можете получить точный подсчет прошедшего года, если посчитаете, сколько месяцев прошло, т. е. если вы подсчитали месяцы точно, вы можете точно подсчитать годы, в году будет 12 полных месяцев, начните считать с 0 и после того, как вы Если нажать 12, вы вернетесь назад к 0, поэтому числа будут 10 11 0 1 2 3 ... как на рисунке ниже, если считать до 2, затем перезапустите -

enter image description here [/g2]

В любом случае программисты просто делали то, что им было легче.

1
ответ дан 15 August 2018 в 18:48

Doc для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для основанного на нуле:

Использование нуля для запуска подсчет на самом деле является трюком оптимизации от программистов Ассамблеи. Вместо того, чтобы присваивать 1 регистру count, они XOR'или регистр с самим собой, что было немного быстрее в цикле CPU. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно с помощью арифметики указателей, где вы бы использовали один базовый указатель указывая на некоторую выделенную память плюс второй указатель, который был бы смещен от этого базового указателя. Здесь, используя нулевое значение, очень важно указать смещение на базу блока памяти. (Общая логика массива имеет тенденцию быть базовым адресом плюс размер записи смещения x.)

И числа, основанные на нулевом значении? Часто многие среды программирования вычисляют данные за несколько дней с тех пор, как некоторые данные по умолчанию. 31 декабря 1899 года - популярная дата, хотя в качестве базовой даты было много других дат. Все остальные даты смещены от этой базы и будут храниться только как один номер. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в настоящую дату, вся окружающая среда должна сделать это, чтобы преобразовать это число в настоящую дату.

Однако комбинация массивов с нулевым основанием и значений месяца на основе 1 проблема. Чтобы получить название месяца месяца 9, вам нужно будет получить элемент 8 из массива месяца. Некоторые разработчики были бы счастливы с уменьшением номера месяца, прежде чем получить его имя. Другие предпочли изменить месяц на что-то ноль-основанное, потому что люди просто хотят знать имя, а не число.

Кроме того, есть более чем одна причина, по которой можно было подумать, что в Date / Calendar есть неправильные:

Удивительные базы (1900 в качестве базы года в Дате, по общему признанию, для устаревших конструкторов; 0 в качестве базы месяца в обоих). Mutability - использование неизменяемых типов упрощает работу с действительно эффективными значениями. Недостаточный набор типов: приятно иметь дату и календарь как разные вещи, но разделение «локальных» и «зональных» значений отсутствует, а также дата / время против даты и времени. API, который приводит к уродливому коду с магическими константами, а не явно названным методам. API, о котором очень сложно рассуждать - все дело о том, когда вещи пересчитаны и т. д. Использование конструкторов без параметров по умолчанию «сейчас», что приводит к жесткому тестированию кода
2
ответ дан 25 May 2018 в 09:37

Документ для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для нуля на основе:

Использование нуля для начала подсчета - это трюк для оптимизации программистов на ассемблере. Вместо того, чтобы назначать 1 в регистр подсчета, они XOR'или регистр с собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы используете один базовый указатель указывая на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл для указания смещения к основанию блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс размер записи со смещением x.)

И числа месяцев с нулями? Часто во многих средах программирования данные рассчитываются как количество дней, прошедшее с некоторых данных по умолчанию. 31 декабря 1899 года является популярной датой, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены относительно этой базы и будут сохранены как одно целое число. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что требуется от среды, - это преобразовать это число в реальную дату.

Однако комбинация массивов, основанных на нулях, и значений месяца, основанных на 1, приносит проблема. Чтобы получить название месяца 9, вам нужно получить элемент 8 из массива month. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочитали менять месяц на ноль, поскольку люди просто хотят знать имя, а не номер. Это личное мнение.

Более того, есть более чем причина, по которой можно подумать, что что-то не так с датой / календарем:

  • Удивительные основы (1900 как годовая база в Date, по общему признанию для устаревших конструкторов; 0 как база месяца в обоих)
  • Изменчивость - использование неизменяемых типов значительно упрощает работу с действительно эффективными значениями
  • Недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение «локальных» и «зонированных» значений отсутствует, как и дата / время против даты против времени
  • API, который приводит к некрасивый код с магическими константами, вместо четко названных методов
  • API, о котором очень трудно рассуждать - все дело в том, когда что-то пересчитывается и т. д.
  • Использование конструкторов без параметров для по умолчанию «сейчас», что приводит к трудному для тестирования коду
2
ответ дан 2 August 2018 в 00:31

Документ для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для нуля на основе:

Использование нуля для начала подсчета - это трюк для оптимизации программистов на ассемблере. Вместо того, чтобы назначать 1 в регистр подсчета, они XOR'или регистр с собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы используете один базовый указатель указывая на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл для указания смещения к основанию блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс размер записи со смещением x.)

И числа месяцев, начинающиеся с нуля? Часто во многих средах программирования данные рассчитываются как количество дней, прошедшее с некоторых данных по умолчанию. 31 декабря 1899 года является популярной датой, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены относительно этой базы и будут сохранены как одно целое число. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что требуется от среды, - это преобразовать это число в реальную дату.

Однако комбинация массивов, основанных на нулях, и значений месяца, основанных на 1, приносит проблема. Чтобы получить название месяца 9, вам нужно получить элемент 8 из массива month. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочитали менять месяц на ноль, поскольку люди просто хотят знать имя, а не номер. Это личное мнение.

Более того, есть более чем причина, по которой можно подумать, что что-то не так с датой / календарем:

  • Удивительные основы (1900 как годовая база в Date, по общему признанию для устаревших конструкторов; 0 как база месяца в обоих)
  • Изменчивость - использование неизменяемых типов значительно упрощает работу с действительно эффективными значениями
  • Недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение «локальных» и «зонированных» значений отсутствует, как и дата / время против даты против времени
  • API, который приводит к некрасивый код с магическими константами, вместо четко названных методов
  • API, о котором очень трудно рассуждать - все дело в том, когда что-то пересчитывается и т. д.
  • Использование конструкторов без параметров для по умолчанию «сейчас», что приводит к трудному для тестирования коду
2
ответ дан 4 August 2018 в 15:59

Документ для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для нуля на основе:

Использование нуля для начала подсчета - это трюк для оптимизации программистов на ассемблере. Вместо того, чтобы назначать 1 в регистр подсчета, они XOR'или регистр с собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы используете один базовый указатель указывая на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл для указания смещения к основанию блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс размер записи со смещением x.)

И числа месяцев, начинающиеся с нуля? Часто во многих средах программирования данные рассчитываются как количество дней, прошедшее с некоторых данных по умолчанию. 31 декабря 1899 года является популярной датой, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены относительно этой базы и будут сохранены как одно целое число. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что требуется от среды, - это преобразовать это число в реальную дату.

Однако комбинация массивов, основанных на нулях, и значений месяца, основанных на 1, приносит проблема. Чтобы получить название месяца 9, вам нужно получить элемент 8 из массива month. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочитали менять месяц на ноль, поскольку люди просто хотят знать имя, а не номер. Это личное мнение.

Более того, есть более чем причина, по которой можно подумать, что что-то не так с датой / календарем:

  • Удивительные основы (1900 как годовая база в Date, по общему признанию для устаревших конструкторов; 0 как база месяца в обоих)
  • Изменчивость - использование неизменяемых типов значительно упрощает работу с действительно эффективными значениями
  • Недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение «локальных» и «зонированных» значений отсутствует, как и дата / время против даты против времени
  • API, который приводит к некрасивый код с магическими константами, вместо четко названных методов
  • API, о котором очень трудно рассуждать - все дело в том, когда что-то пересчитывается и т. д.
  • Использование конструкторов без параметров для по умолчанию «сейчас», что приводит к трудному для тестирования коду
2
ответ дан 7 August 2018 в 18:04

Документ для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для нуля на основе:

Использование нуля для начала подсчета - это трюк для оптимизации программистов на ассемблере. Вместо того, чтобы назначать 1 в регистр подсчета, они XOR'или регистр с собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы используете один базовый указатель указывая на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл для указания смещения к основанию блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс размер записи со смещением x.)

И числа месяцев, начинающиеся с нуля? Часто во многих средах программирования данные рассчитываются как количество дней, прошедшее с некоторых данных по умолчанию. 31 декабря 1899 года является популярной датой, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены относительно этой базы и будут сохранены как одно целое число. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что требуется от среды, - это преобразовать это число в реальную дату.

Однако комбинация массивов, основанных на нулях, и значений месяца, основанных на 1, приносит проблема. Чтобы получить название месяца 9, вам нужно получить элемент 8 из массива month. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочитали менять месяц на ноль, поскольку люди просто хотят знать имя, а не номер. Это личное мнение.

Более того, есть более чем причина, по которой можно подумать, что что-то не так с датой / календарем:

  • Удивительные основы (1900 как годовая база в Date, по общему признанию для устаревших конструкторов; 0 как база месяца в обоих)
  • Изменчивость - использование неизменяемых типов значительно упрощает работу с действительно эффективными значениями
  • Недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение «локальных» и «зонированных» значений отсутствует, как и дата / время против даты против времени
  • API, который приводит к некрасивый код с магическими константами, вместо четко названных методов
  • API, о котором очень трудно рассуждать - все дело в том, когда что-то пересчитывается и т. д.
  • Использование конструкторов без параметров для по умолчанию «сейчас», что приводит к трудному для тестирования коду
2
ответ дан 10 August 2018 в 06:51

Документ для GtkCalendar: http://developer.gnome.org/gtk/2.24/GtkCalendar.html

Общее объяснение для нуля на основе:

Использование нуля для начала подсчета - это трюк для оптимизации программистов на ассемблере. Вместо того, чтобы назначать 1 в регистр подсчета, они XOR'или регистр с собой, что было немного быстрее в циклах ЦП. Это означало, что подсчет начнется с 0 и будет всегда соответствовать длине элементов, исключая последний.

Кроме того, использование нуля также популярно в арифметике указателей, где вы используете один базовый указатель указывая на некоторую выделенную память, плюс второй указатель, который будет со смещением от этого базового указателя. Здесь использование нулевого значения имеет большой смысл для указания смещения к основанию блока памяти. (Общая логика массива, как правило, представляет собой базовый адрес плюс размер записи со смещением x.)

И числа месяцев, начинающиеся с нуля? Часто во многих средах программирования данные рассчитываются как количество дней, прошедшее с некоторых данных по умолчанию. 31 декабря 1899 года является популярной датой, хотя в качестве базовой даты использовалось множество других дат. Все остальные даты смещены относительно этой базы и будут сохранены как одно целое число. Фракции будут использоваться для указания часов, минут и секунд, где 0,25 будет 24/4 = 6 часов. Таким образом, чтобы преобразовать дату в реальную дату, все, что требуется от среды, - это преобразовать это число в реальную дату.

Однако комбинация массивов, основанных на нулях, и значений месяца, основанных на 1, приносит проблема. Чтобы получить название месяца 9, вам нужно получить элемент 8 из массива month. Некоторые разработчики были бы рады уменьшить номер месяца, прежде чем получить его название. Другие предпочитали менять месяц на ноль, поскольку люди просто хотят знать имя, а не номер. Это личное мнение.

Более того, есть более чем причина, по которой можно подумать, что что-то не так с датой / календарем:

  • Удивительные основы (1900 как годовая база в Date, по общему признанию для устаревших конструкторов; 0 как база месяца в обоих)
  • Изменчивость - использование неизменяемых типов значительно упрощает работу с действительно эффективными значениями
  • Недостаточный набор типов: хорошо иметь Date и Calendar как разные вещи, но разделение «локальных» и «зонированных» значений отсутствует, как и дата / время против даты против времени
  • API, который приводит к некрасивый код с магическими константами, вместо четко названных методов
  • API, о котором очень трудно рассуждать - все дело в том, когда что-то пересчитывается и т. д.
  • Использование конструкторов без параметров для по умолчанию «сейчас», что приводит к трудному для тестирования коду
2
ответ дан 15 August 2018 в 18:48

Другие вопросы по тегам:

Похожие вопросы: