Почему argc является 'интервалом' (а не 'неподписанным интервалом')?

Вот некоторые ссылки от MSDN Magazine на автоматическом коде тестирования:

  • Используя март 2007 UIAutomation Bugslayer
  • Используя тестовый прогон PowerShell декабрь 2007
  • Тестер, утилита для записи щелчков мышью и нажатий клавиш, затем воспроизводя их & программа, проверяющая поведение. Превосходный для неуправляемого кода. Дескрипторы окон использования так не могут работать хорошо на управляемый код. март 2002 Bugslayer .

62
задан Catskul 21 November 2009 в 00:53
поделиться

13 ответов

Тот факт, что исходный язык C был таким, что по умолчанию любая переменная или аргумент определялась как тип int , вероятно, является другим фактором. Другими словами, у вас может быть:

  main(argc, char* argv[]);  /* see remark below... */

вместо

int main(int argc, char *argv[]);

Edit : эффективно, как напомнил нам Аарон, очень оригинальный синтаксис был бы чем-то вроде

  main(argc, argv) char **argv {... } 

, поскольку «прототипы» были представлены позже. Это произошло примерно после того, как каждый зарегистрировал минимум 10 часов в поисках тонких (и не очень тонких) ошибок, связанных с типами

51
ответ дан 24 November 2019 в 16:43
поделиться

Несколько причин:

  • потому что это не так. имеет значение
  • , потому что в C изначально не было ключевого слова unsigned или целочисленных типов без знака
  • , потому что C изначально не проверял типы параметров и даже не имел прототипов.
    В результате , было обычной практикой даже не объявлять типы int , поскольку это было по умолчанию.
  • потому что int тогда в некотором смысле был более важным. Все было инт. C частично произошел от языка, в котором даже не было типов. Каждая переменная представляла собой слово , для чего изначально использовалась int .

ОБНОВЛЕНИЕ: Джейсон С. запросил источники. Развитие языка C . Возможно, вам придется найти более ранние языки BCPL и B в обычных местах.

30
ответ дан 24 November 2019 в 16:43
поделиться

Because C is old, and it was designed that way from the start. It's too late to change it now.

12
ответ дан 24 November 2019 в 16:43
поделиться

Here's a history of the C programming language in dmr's own words. It's not stated explicitly (at least not from the quick skim I gave it), but the earliest versions of C didn't support unsigned types. mjv's point about implicit typing to int is also relevant.

EDIT

The Bell Labs link has been broken for a while: here's an alternate link to the same paper.

11
ответ дан 24 November 2019 в 16:43
поделиться

Другой причиной может быть то, что беззнаковые типы могут быть неудобны для итерации. Например, следующий фрагмент, повторяющийся вниз:

for (size_t i = SIZE - 1; i >= 0; --i)
  ...

, на самом деле, является ошибкой. Когда i достигает 0 на последней итерации, он переходит прямо в 4294967295 (на 32-битной машине), и цикл не завершается.

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

7
ответ дан 24 November 2019 в 16:43
поделиться

Руководство по стилю Google C ++ предлагает никогда не использовать типы unsigned int , если вы не работаете с фактическими битовыми шаблонами. Их логика применима и к C. Строка краткого обзора:

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

Вероятно, это не было в умах первоначального создателя C, но кто знает‽

6
ответ дан 24 November 2019 в 16:43
поделиться

It was a prescient design decision to make it easier to port C programs to Java in the future since there are no unsigned types in Java.

4
ответ дан 24 November 2019 в 16:43
поделиться

Я понимаю, как это может показаться странным: argc не должно быть отрицательным! Но посмотрите на это так: и int , и unsigned int охватывают диапазон значений, которые вы бы приняли (если у вас есть 2 ^ 31 параметров командной строки, у вас есть проблема) и int короче для ввода.

Вопрос-загадка для интервью: сколько клавиатур было бы израсходовано, набирая unsigned , если бы C использовал unsigned int argc ?

1
ответ дан 24 November 2019 в 16:43
поделиться

При установке значения int диапазон ограничивается значением от 1 до INT_MAX включительно. Как правило, это означает, что никакое случайное приведение или псевдоним не выведет его из диапазона непреднамеренного переноса. Это также позволяет реализациям использовать весь отрицательный диапазон и диапазон 0.

Хорошо, я только что придумал. Настоящая причина в том, что это было просто произвольное решение, которое принял один из разработчиков исходного языка C, и до сих пор никто особо не задумывался об этом. :)

0
ответ дан 24 November 2019 в 16:43
поделиться

Простой вопрос: ожидаете ли вы более 2 31 (или даже более 2 15 ) аргументов командной строки? Я сомневаюсь, что большинство операционных систем сможет справиться с таким количеством.

0
ответ дан 24 November 2019 в 16:43
поделиться

I suppose it is designed to be compatible with C, and in C times people didn't really care that much about signed/unsigned correctness.

-2
ответ дан 24 November 2019 в 16:43
поделиться

В качестве решения вашей проблемы с предупреждениями вы можете сделать что-то вроде этого, чтобы подавить предупреждения:

const unsigned int uargc = (unsigned int) argc;
5
ответ дан 24 November 2019 в 16:43
поделиться

Объявление для main () было определено до того, как беззнаковые типы были добавлены в язык - см. Страницу DMR на " Первобытный C ". Когда добавляли unsigned, было слишком поздно что-то менять.

3
ответ дан 24 November 2019 в 16:43
поделиться
Другие вопросы по тегам:

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