|
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
|
||||||||||||||||
Приведение типов и switch05.05.2019, 14:44. Показов 1893. Ответов 43
Метки нет (Все метки)
Всем привет. Начал изучать C и возникли некоторые трудности, ответы на которые я либо не нашел либо не понял.
Приведение типов. Почему я не могу просто выполнить int(value), где value например строка содержащая цифру 5 и получить 5 в int?
В уроках написано что case может принимать группированные параметры типо "case 1, 2, 4:", но у меня так не заработало, интересно почему? Зато заработало вот так
Буду очень рад если вы мне поможете с этими вопросами.
0
|
||||||||||||||||
| 05.05.2019, 14:44 | |
|
Ответы с готовыми решениями:
43
Объясните, как в примере работает приведение типов Не требуется приведение типов при умножении типов Byte
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 05.05.2019, 15:53 | |
|
Wi0M, по вашему профилю я понял, что вы специалист по Питону. И это не такая уж простая работа, изучать похожий язык. Мой опыт сводится к изучению JavaScript & PHP после неплохого владения Си(С++). И хоть мне и прочили легкий и безболезненный вход, намучился я изрядно. (мучения еще не закончены).
Мои выводы: - Изучение ПОХОЖЕГО языка не так просто, как кажется. - Имеет смысл все забыть и начинать как бы с нуля (что тоже не просто, легко забыть, что именно надо подвергнуть забыванию) - Не ругаться на этот другой язык. Просто понять, что он - другой. И желаю вам удачи!
1
|
|
|
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 189
|
|
| 05.05.2019, 16:05 | |
|
*И Байт, и Evg, уже разъяснили что и как, я надеюсь.
Я просто хочу подчеркнуть (и возможно прояснить), что switch (n) -- это выбор, который надо принять здесь и сейчас. n -- может быть чем угодно, и все что я запомню -- это его значение. И это значение должно быть целочисленным. любой последующий case, фактически, выполняет сравнение, (мой случай) == n
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
|||
| 05.05.2019, 17:55 | |||
(3, 4) использует оператор "запятая" и дает результат 4, как вам уже объяснили выше. Однако значение в case должно быть константным выражением, а оператор "запятая" в языке С не порождает константного выражения.
0
|
|||
|
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 189
|
|
| 05.05.2019, 18:01 | |
|
Я думаю надо посмотреть на задачу с другой стороны.
Байт уже рассказал что значит 3, 4 и (3,4) switch(n) -- немного другая история. n может быть чем угодно, возвращающем целое число. т.е. вместо n можно написать все что хочется, но результатом n должно быть целое число, иначе switch работать не будет.
0
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 05.05.2019, 18:06 | |
|
TheCalligrapher, Однако, у ТС выражение "case (3,4):" не вызвало синтаксической ошибки и сработало... Именно так, как и предполагалось, как "case 4:"
И ваши соображения, хотя и верны, но требуют более конкретного анализа ситуации. Впрочем, все это было уже проанализировано в предыдущих сообщениях этого топика. Имхо, транслятор не так глуп, чтобы не суметь преобразовать "3,4" в просто "4". Возможно, он и "case sqrt(x), printf("tra-ta-ta"), 8-4 :" преобразует в "case 4:" Не знаю, не проверял. Интересующиеся могут попробовать.
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
|||
| 05.05.2019, 18:12 | |||
(3,4) будет просто 4, но при этом (3,4) отличается от просто 4 тем, что просто 4 - это целочисленное константное выражение, а (3,4) - нет. Поэтому код case (3,4): не будет компилироваться вообще.Добавлено через 2 минуты
1
|
|||
|
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 189
|
|
| 05.05.2019, 18:17 | |
|
если синтаксически все верно, то n будет целым числом, и это все. оно не может быть чем-то еще. это определено семантикой (смыслом).
более строго, n, всегда будет значением, равным значению некоторого целого числа, при условии корректного синтаксиса. поправьте, если я не прав в формулировках.
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
|||||||
| 05.05.2019, 18:21 | |||||||
double не может использоваться в switch.
0
|
|||||||
|
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 189
|
||
| 05.05.2019, 18:24 | ||
d не является целым числом.
0
|
||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
||
| 05.05.2019, 18:26 | ||
|
Поэтому мне не ясно ваше утверждение "если синтаксически все верно, то n будет целым числом". Как первая часть этого утверждения обуславливает вторую? Зачем вы напираете на слово "синтаксически"?
1
|
||
|
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 189
|
||
| 05.05.2019, 18:46 | ||
|
согласен, утверждение не верно. Все что я хотел сказать -- это n есть целое число, каким бы образом оно к нему не приводилось. простите за не однозначность (мою глупость).
Добавлено через 15 минут
0
|
||
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|||||||||||||||||
| 05.05.2019, 22:30 | |||||||||||||||||
|
Да, приведенный вами в посте 28 код вполне нелеп. Но он и синтаксически и семантически совершенно корректен. То есть корректен по всем параметрам и будет прекрасно выполняться. Он эквивалентен
Аналог
![]() Добавлено через 4 минуты Если хотите, вот пример.
Не по теме: В общем-то, я думаю, следует выпустить воздух, и не искать секретов там, где их нет.
0
|
|||||||||||||||||
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
||||||
| 06.05.2019, 01:33 | ||||||
switch неявное приведение типов НЕ выполняется. Значение сразу должно иметь целочисленный тип. Попытка указать значение типа double - ошибка.switch(d) грубо некорректен и не будет компилироваться.И таких примеров - множество. Ни о каком double не может быть и речи ни в адресной арифметике, ни в операторах сдвига, ни в логических операторах и т.д. И ваши мечты об "автоматическом приведении типов" здесь никак не помогут. Не будет никакого "автоматического приведения типов". Код сразу некорректен.Я никогда не был приверженцем философии "просто попробуйте", но в данном случае, чисто на всякий случай для начала вы бы могли просто попробовать. И дальше уже разбираться оттуда. switch же в C работает по правилам switch. Ничего общего в плане неявных преобразований они не имеют.double в качестве аргумента switch.Еще раз: я никогда не был приверженцем философии "просто попробуйте", но в данном случае, чисто на всякий случай вы бы могли сначала просто попробовать.
0
|
||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
||||||||||||||
| 06.05.2019, 02:17 | ||||||||||||||
1
|
||||||||||||||
|
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
|
|
| 06.05.2019, 08:17 [ТС] | |
|
Да чет как то так получилось странно. Поставил на чистой машине gcc и попробовал скомпилировать case (2,3) и не вышло.
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
||
| 06.05.2019, 08:21 | ||
case (2,3): допустимо только в С++ и только начиная с C++11.А вы что пробовали?
0
|
||
|
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
|
|
| 06.05.2019, 08:24 [ТС] | |
|
TheCalligrapher, да все я читал. только что мне ваше чтение если у меня все компилируется? вы меня тоже читать то не забывайте) ну и теперь уже совсем другой вопрос. что у меня за каша творится, если я могу без наказано делать так? (речь все еще про case (2,3), если что)
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
||||
| 06.05.2019, 08:28 | ||||
|
0
|
||||
|
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
|
|
| 06.05.2019, 08:30 [ТС] | |
|
TheCalligrapher, И да и нет) На маке компилируется, на дебиане нет. На маке стоит и gcc и g++, на дебиане только gcc.
Добавлено через 42 секунды самое удивительное что для компиляции на маке используется gcc
0
|
|
|
Вездепух
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,331
|
||
| 06.05.2019, 08:32 | ||
|
Как называется компилируемый файл? Какой язык программирования в выбрали в командной строке gcc?
0
|
||
| 06.05.2019, 08:32 | |
|
Приведение типов Приведение типов Приведение типов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|