Если переменным одного типа можно присваивать значения другого типа, (зачем вообще типизация нужна тогда?)

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Если переменным одного типа можно присваивать значения другого типа,

Сообщение promov »

Действительно, рабочая программа, демонстрирующая работу функций getchar и putchar

Код: Выделить всё

#include <stdio.h>
int main () {
 int a;
 a= getchar ();
 while (a!= EOF) {
  putchar (a);
  a= getchar ();
 }
return 0;
}


На её описании останавливаться не буду- оно есть у Кернигана и Ричи, есть у Кочана, да может, ещё где. Итак, переменным типа int возможно присваивать значение типа char, "...хотя это и нельзя считать хорошим стилем программирования" (Cтефан Кочан). Я это прочёл: если нельзя, но очень хочется, то можно. Хорошо. Но ведь и эта программа работает тоже:

Код: Выделить всё

#include <stdio.h>
int main () {
 char i;
 i= 116;
 printf ("%c\n", i);
 return 0;
}


На этот раз переменной типа char присваивается значение типа int. И небезуспешно- программа преспокойно выводит t.
Друзья! Для чего вообще нужна типизация данных? Да для того, чтобы такие ситуации пресекать. Чтобы нельзя было к букве прибавить число. Чтобы нельзя было число прочитать как символ. И машина должна выдавать сообщение об ошибке.

Получается, лазейки в синтаксисе придуманы с одной целью- чтобы можно было число, соответствующее EOF cравнить с числом, cоответствующим вводимому символу. -1 т. е. сравнить, допустим со 116 (если вводится символ t)

Ну и совсем уже наивный вопрос: а что, нельзя было сделать так, чтобы число, соответствующее EOF равнялось не -1, а, допустим 254? В конце кодовой таблицы какие-то знаки ненужные, а если конец файла такой нужный, потеснить бы их и его туда впихать. Тогда код номер один приобрёл бы видr

Код: Выделить всё

#include <stdio.h>
int main () {
 char a;
 a= getchar ();
 while (a!= EOF) {
  putchar (a);
  a= getchar ();
 }
return 0;
}


И порядок был бы соблюдён- вводим символы и присваиваем эти значения переменным соответствующего типа.
Может, не прав но вакханалию эту терпеть не могу больше.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Uncle_Theodore »

promov писал(а):
22.10.2007 21:47
Друзья! Для чего вообще нужна типизация данных? Да для того, чтобы такие ситуации пресекать. Чтобы нельзя было к букве прибавить число. Чтобы нельзя было число прочитать как символ. И машина должна выдавать сообщение об ошибке.

Нет, не для этого совсем.
А для того, чтобы память экономить. :)
Может, не прав но вакханалию эту терпеть не могу больше.

Жаль... Перейдете на LISP? :)
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение promov »

Всему своё время.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение _Gleb_ »

Uncle_Theodore писал(а):
22.10.2007 21:50
Жаль... Перейдете на LISP? :)

Хорошая вещь?
Изображение
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Uncle_Theodore »

_Gleb_ писал(а):
22.10.2007 22:17
Uncle_Theodore писал(а):
22.10.2007 21:50
Жаль... Перейдете на LISP? :)

Хорошая вещь?

Смотря для чего.
Спасибо сказали:
Аватара пользователя
Ринальдус
Сообщения: 293
Статус: линуксоид-энтузиаст
ОС: Ubuntu 7.10 (Gutsy Gibbon)

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Ринальдус »

зачем вообще типизация нужна тогда?

Имхо, рудимент старых языков программирования. Старый Pascal очень жестко типизировал переменные, они должны были обязательно объявляться и указывать их тип. В PHP, например, такого нет, а раз в PHP нет, то и в C наверное тоже, т.к PHP основан на C (я сам C не изучал, так что могу ошибаться). :)
Сейчас происходит расцвет Линукса, поэтому у меня хорошее настроение! :)
Дневник линуксоида
Новости про Linux
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение _Gleb_ »

Uncle_Theodore писал(а):
22.10.2007 22:55
Смотря для чего.

И для чего LISP хорош?
Изображение
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение eduard_pustobaev »

Ринальдус писал(а):
22.10.2007 23:54
Имхо, рудимент старых языков программирования. Старый Pascal очень жестко типизировал переменные, они должны были обязательно объявляться и указывать их тип. В PHP, например, такого нет, а раз в PHP нет, то и в C наверное тоже, т.к PHP основан на C (я сам C не изучал, так что могу ошибаться). :)

Без обид, но это на башорг.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Uncle_Theodore »

_Gleb_ писал(а):
23.10.2007 00:19
Uncle_Theodore писал(а):
22.10.2007 22:55
Смотря для чего.

И для чего LISP хорош?

Для Искусственного Интеллекта хорош. Для изучения основ функционального программирования хорош. Вообще, ум в порядок приводит. :)

eduard_pustobaev писал(а):
23.10.2007 00:21
Ринальдус писал(а):
22.10.2007 23:54
Имхо, рудимент старых языков программирования. Старый Pascal очень жестко типизировал переменные, они должны были обязательно объявляться и указывать их тип. В PHP, например, такого нет, а раз в PHP нет, то и в C наверное тоже, т.к PHP основан на C (я сам C не изучал, так что могу ошибаться). :)

Без обид, но это на башорг.

Да уж, сказано сильно... :D
Спасибо сказали:
_Gleb_
Сообщения: 467
ОС: Kubuntu 12.04 LTS

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение _Gleb_ »

Uncle_Theodore писал(а):
23.10.2007 00:27
Вообще, ум в порядок приводит. :)

А C с ним что делает?
Изображение
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение eduard_pustobaev »

_Gleb_ писал(а):
23.10.2007 00:28
А C с ним что делает?

А C ничё не делает. Простенько и со вкусом. Образ мышления не трогает, бо обычно алгоритмическое мышление прививают ещё до всякого там программирования.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 512
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Red Gremlin »

И порядок был бы соблюдён- вводим символы и присваиваем эти значения переменным соответствующего типа.
Может, не прав но вакханалию эту терпеть не могу больше.

Lazarus поможет?
P.S. Кстати в С char и int почти одно и тоже - различаются только размером. Это в Паскале есть и byte и char, а в С это один тип.
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
Аватара пользователя
phasma
Сообщения: 405

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение phasma »

нетрудно было бы и набрать man getchar

(man getchar) писал(а):Character values are returned as an unsigned char converted to an int.


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

окончание строки это символ , хотя в отданной области памяти под переменную и после могут быть значения, но они не будут переданы ...
NB: Dell XPS 1330 T5250|DDR2 4GB|NV 8400|250 GB
Old NB: Asus A6km AMD Turion MT-32|DDR 2 GB|NV GFGO 7300|60 Gb
OS: Ubuntu 9.10, FreeBSD 8.0
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Voice »

А я люблю строгую типизацию :)
А то бывает в ПШП, например, опечатку в имени переменной сделаешь и не работает, но ошибок то как бы и нету.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение T.D. »

Uncle_Theodore писал(а):
23.10.2007 00:27
_Gleb_ писал(а):
23.10.2007 00:19
Uncle_Theodore писал(а):
22.10.2007 22:55
Смотря для чего.

И для чего LISP хорош?

Для Искусственного Интеллекта хорош.

Что-то типа Prolog'а?
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение edoc_modnar »

Ринальдус писал(а):
22.10.2007 23:54
зачем вообще типизация нужна тогда?

Имхо, рудимент старых языков программирования. Старый Pascal очень жестко типизировал переменные, они должны были обязательно объявляться и указывать их тип. В PHP, например, такого нет, а раз в PHP нет, то и в C наверное тоже, т.к PHP основан на C (я сам C не изучал, так что могу ошибаться). :)

Убило и разорвало труп.
ЧТо нам женская логика? Мы умеем круче!
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Uncle_Theodore »

T.D. писал(а):
23.10.2007 14:30
Uncle_Theodore писал(а):
23.10.2007 00:27
_Gleb_ писал(а):
23.10.2007 00:19
Uncle_Theodore писал(а):
22.10.2007 22:55
Смотря для чего.

И для чего LISP хорош?

Для Искусственного Интеллекта хорош.

Что-то типа Prolog'а?

Нет, ПРОЛОГ -- декларативный язы, а ЛИСП -- функциональный. Разные парадигмы.
Спасибо сказали:
Аватара пользователя
T.D.
Сообщения: 381
Статус: Streetball is my life
ОС: Gentoo 2007.0

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение T.D. »

Uncle_Theodore писал(а):
23.10.2007 17:29
Нет, ПРОЛОГ -- декларативный язы, а ЛИСП -- функциональный. Разные парадигмы.

Понятно. Я просто ЛИСП никогда не видел и, честно говоря, не слышал о нем. Поэтому и поинтересовался.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение drBatty »

T.D. писал(а):
23.10.2007 17:40
Понятно. Я просто ЛИСП никогда не видел и, честно говоря, не слышал о нем. Поэтому и поинтересовался.
А интересный язык. Мне понравился. Рекомендовать не буду, да и не услышате моих рекомендаций, но интересный. Конечно Си удобнее.
PS: Ещё: присваивать int к char'у вполне безопасно, в том смысле, что это просто целые числа со знаком. Ещё легче присваивать char к int тут уж никаких проблем не будет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
promov
Сообщения: 384
Статус: Участник
ОС: Debian GNU/Linux

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение promov »

Друзья! Так я не понял, типизация необходима, или Бог с ней, с типизацией?
Я почему так на её стороне? А вот почему:
"Человек, решающий какую-нибудь задачу "вручную", обладает интуитивной способностью быстро разобраться в типах данных и тех операциях, котрые для каждого типа справедливы; известно, например, что нельзя извлечь квадратный корень из слова или написать число с заглавной буквы. Одна из причин, позволяющих легко провести такое распознавание, состоит в том, что слова, числа и другие обозначения выглядят по-разному. Jlyfrjдля компьютера все типы данных сводятся, в конечном счёте, к последовательности битов, образующих байты- содержимому ячеек памяти, поэтому различие в типах следует делать явным" Г. Г. Рапаков, C. Ю. Ржеуцкая, "Turbo Pascal для студентов и школьников", Санкт-Петербург, "БХВ- Петербург", 2005 г.

Я понимаю, вы все в этом вопросе ориентируетесь на свой личный опыт программирования (он у вас всех различен, поэтому и мнения различны). Но мне-то на что ориентироваться, коль скоро опытт программирования минимален? Можно ориентироваться на носпоримые знания о типах, но для этого надо узнать, что там внутри компьютера и как.

Друзья! Кто-нибудь из вас готов преподать мне такой минимум? Может, пойму, может, не пойму, но попытаемся, а? Ну или: что почитать-то?

И, наконец,
phasma писал(а):
23.10.2007 10:34
нетрудно было бы и набрать man getchar
(man getchar) писал(а):Character values are returned as an unsigned char converted to an int.


Если бы я мог это набрать, я бы это набрал. А если не набрал, значит, не мог набрать.
Зачем хорёк пошел в ларёк, зачем барсук полез на сук...
Мораль легко уразуметь: зачем на бал пришёл медведь?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Liksys »

Стивен Прата, "Язык программирования С: лекции и упражнения"
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Portnov »

Языков программирования много, и один из критериев их классификации - строгость и свойства типизации. Получается целая шкала - от полного отсутствия типизации (например, forth по сути бестиповый), до строгой типизации, как в Паскале, Аде или Хаскеле. Си - где-то ближе к Паскалю, но не очень близко.
Типизация бывает от "никакой" до строгой. "Никакая" типизация удобна для быстрой разработки простых приложений-скриптов (см. например sh, там единственный тип данных - строка). Строгая типизация удобна (зачастую незаменима) в больших приложениях, где требуется, чтобы транслятор отлавливал побольше ошибок программиста. Например, про известный строгой типизацией Хаскель ходит поговорка, что если программа скомпилировалась, значит она будет работать правильно (это конечно не всегда так, но основания для этой поговорки есть).
Так что ответ на вопрос
promov писал(а):
23.10.2007 19:38
Так я не понял, типизация необходима, или Бог с ней, с типизацией?

очень простой: в некоторых задачах без строгой типизации никуда, в некоторых - она только мешает.

ЗЫ. Еще правда есть разделение на статическую и и динамическую типизацию, но это уже немного не про то.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Лис
Сообщения: 1639
ОС: Zenwalk

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Лис »

"Никакая" типизация удобна для быстрой разработки простых приложений-скриптов (см. например sh, там единственный тип данных - строка).

Да уж. Так достает отсутствие типизации в bash.
в некоторых - она только мешает

А как она может помешать? Она ведь всего лишь обязывает явно приводить типы данных, т.е. приучает к порядку.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение drBatty »

promov писал(а):
23.10.2007 19:38
Друзья! Так я не понял, типизация необходима, или Бог с ней, с типизацией?
Я почему так на её стороне? А вот почему:

Вот из моего опыта я только и могу сказать - "пасквиль - зло". Зло потому, что он придуман не для работы, а для обучения. Возможно для обучения тому, что есть типы данных этот язык благо, но не для жизни. В жизни придётся познать Си, причём чужую и кривую реализацию, ещё и заточеную под процессор, который сейчас только в музеях увидишь. Естественно, что надо сразу писать программы, которые будут работать хоть на пятибитных, хоть на пятисотбитных char'ах, это уже вопрос больше культуры.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение drBatty »

Portnov писал(а):
23.10.2007 20:44
Строгая типизация удобна (зачастую незаменима) в больших приложениях, где требуется, чтобы транслятор отлавливал побольше ошибок программиста. Например, про известный строгой типизацией Хаскель ходит поговорка, что если программа скомпилировалась, значит она будет работать правильно (это конечно не всегда так, но основания для этой поговорки есть).

Вообще ошибки связаные с типом очень легко найти и исправить, намного сложнее исправить и найти ошибки связаные с неправильной реализацией алгоритма, в том числе и с неправильной реализацией типов, хотя компилятор всё нормально переваривает. При чём тут типы, если сам кодер пишет class-void-class, а потом удивляется?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Лис
Сообщения: 1639
ОС: Zenwalk

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Лис »

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

А это почему?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение drBatty »

Лис писал(а):
24.10.2007 10:42
чужую и кривую реализацию, ещё и заточеную под процессор, который сейчас только в музеях увидишь.

А это почему?

Ну вот понадобилось тебе реализовать какой-то алгоритм, ты пошёл и купил Книгу, к примеру "Исскуство програмирования" Кнута. Книга авторитетная, и никто здесь не будет спорить с этим. Вот только этот Кнут приводит примеры мало того, что на ассемблере, так ещё и на асме для компьютера который сам Кнут придумал. И типы он тоже сам придумал, какие захотел. Вот char у него обычно пятибитный, ему хватает(для того, что-бы его программы работали на любом железе).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Лис
Сообщения: 1639
ОС: Zenwalk

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Лис »

Вот только этот Кнут приводит примеры мало того, что на ассемблере, так ещё и на асме для компьютера который сам Кнут придумал. И типы он тоже сам придумал, какие захотел. Вот char у него обычно пятибитный, ему хватает(для того, что-бы его программы работали на любом железе).

Вы же про С говорили. А он, вроде как, платформонезависимый. В нем только несколько типов данных зависят от платформы, да и для них имеются платформонезависимые аналоги.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение Portnov »

Лис писал(а):
24.10.2007 10:12
Да уж. Так достает отсутствие типизации в bash.


Это вы явно пытаетесь писать на bash что-то большое (для bash скрипт на 100-200 строк - большой). Не надо - оно для этого не предназначено. Возьмите хотя бы zsh (там хоть функции есть), а лучше - какойнить другой язык, с типизацией. Например, python.

drBatty писал(а):
24.10.2007 10:33
В жизни придётся познать Си, причём чужую и кривую реализацию, ещё и заточеную под процессор, который сейчас только в музеях увидишь


Если я правильно понял, вы имеете ввиду некоторую абстрактную реализацию С, заточенную под MIX-процессор. Я никогда такой не видел. Современные компиляторы оптимизируют под современные процессоры.

Лис писал(а):
24.10.2007 10:12
А как она может помешать? Она ведь всего лишь обязывает явно приводить типы данных, т.е. приучает к порядку.


Про "приучает к порядку" - не спорю, это конечно хорошо. Как она может мешать - да вот банальный пример из C:

Код: Выделить всё

int i=2;
float j = (float)(1/i);

Не всем сразу очевидно, что j окажется равным 0.

drBatty писал(а):
24.10.2007 10:40
Вообще ошибки связаные с типом очень легко найти и исправить

Ой не факт... В том же C до чёрта примеров совершенно неуловимых багов, появляющихся из-за недостаточно строгой проверки типов при работе с целыми и дробными числами, с указателями и пр.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Если переменным одного типа можно присваивать значения другого типа,

Сообщение drBatty »

Лис писал(а):
24.10.2007 11:52
Вы же про С говорили. А он, вроде как, платформонезависимый. В нем только несколько типов данных зависят от платформы, да и для них имеются платформонезависимые аналоги.

А в Си все типы платформозависимы. Начиная с int, его конкретный тип зависит от платформы. Поэтому в Си програмист может либо писать программы которые не зависят от типа(в определёных пределах, конечно), либо определить(для каждой платформы) свой независимый тип. А может писать под конкретно свою платформу, что многие и делают, вот проблемы с типами и возникают когда переписываешь чью нибудь программу.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: