как это работает? while(!((str[i]>='0'&&str[i]<='9')||str[i]=='\0')), как я понимаю это значит "пока стр не равно числовому символу или стр не равно нуль символу выполнять тело цикла", но это неверно ведь если бы это было верно то условие while(!((str[i]>='0'&&str[i]<='9')||str[i]=='\0')) и условие
while(!(str[i]>='0'&&str[i]<='9')||str[i]!='\0') были бы одинаковы, но они выполняются по разному. Вроде бы основы основ, но я почему-то сейчас туплю и не могу понять это.
Другие языки программирования и технологии
while(!((str[i]>='0'&&str[i]<='9')||str[i]=='\0')) как перевести на человеческий язык это условие? - Язык си
Поэтому в коде ставят пробелы)))
!( ( str[i] >= '0' && str[i] <= '9' ) || str[i] == '\0' )
Не важно, что тут написано по отдельности... Суть:
!( ( условие && условие ) || условие )
Внешние !( ...) можно отбросить. Сначала посмотреть, что возвращает внутреннее - а уже потом взять его обратное значение ( восклицательный знак - отрицание).
Проверка идет слева направо. ( условие && условие ) — это дело вернет true только если И первое, И второе условия верны. В таком случае уже не важно, что там идет после ||
Если до || получено true - вычисления прекращаются. Поэтому условие целиком, уже с отрицанием, вернет false.
А если из первых скобок хотя бы одно условие будет неверным - вернется false и пойдет проверка условия после || - в зависимости от него и будет получен результат.
_____________
!( str[i] >= '0' && str[i] <= '9' ) || str[i]!='\0'
А тут сначала пойдет проверка условия до ||, если внутри скобок окажется false... если в предыдущем примере оно бы еще посмотрело следующее условие, то тут восклицательный знак его сразу превратит в true и вычисление прекратится.
https://jsfiddle.net/OPTlMUS/0jr8h7cb/ - Демо.
!( ( str[i] >= '0' && str[i] <= '9' ) || str[i] == '\0' )
Не важно, что тут написано по отдельности... Суть:
!( ( условие && условие ) || условие )
Внешние !( ...) можно отбросить. Сначала посмотреть, что возвращает внутреннее - а уже потом взять его обратное значение ( восклицательный знак - отрицание).
Проверка идет слева направо. ( условие && условие ) — это дело вернет true только если И первое, И второе условия верны. В таком случае уже не важно, что там идет после ||
Если до || получено true - вычисления прекращаются. Поэтому условие целиком, уже с отрицанием, вернет false.
А если из первых скобок хотя бы одно условие будет неверным - вернется false и пойдет проверка условия после || - в зависимости от него и будет получен результат.
_____________
!( str[i] >= '0' && str[i] <= '9' ) || str[i]!='\0'
А тут сначала пойдет проверка условия до ||, если внутри скобок окажется false... если в предыдущем примере оно бы еще посмотрело следующее условие, то тут восклицательный знак его сразу превратит в true и вычисление прекратится.
https://jsfiddle.net/OPTlMUS/0jr8h7cb/ - Демо.
Виталий Мамчур
Огромное спасибо вам за развернутый ответ, но как я понял! просто поменяет || на && и тогда все становится ясно
Не "пока стр не равно числовому символу или стр не равно нуль символу" , а пока элемент строки с индексом i "не равен.... и т. д."
Виталий Мамчур
это понятно, но мне нужно суть понять, я оказывается не знал что || поменяется на && если перед ним поставить !
Приоритет '!' ВЫШЕ приоритета '||'.
!((str[i] >= '0' && str[i] <= '9') || str[i] == '\0') - применяем NOT (!) ко ВСЕМУ выражению
!(str[i] >= '0' && str[i] <= '9') || str[i] == '\0' - применяем NOT к ЧАСТИ выражения ДО ||
Если раскрыть скобки (зачем программистам математика?), то первое выражение равно:
!((str[i] >= '0' && str[i] <= '9') || str[i] == '\0') ==
!(str[i] >= '0' && str[i] <= '9') && !(str[i] == '\0') ==
!(str[i] >= '0' && str[i] <= '9') && str[i] != '\0'
А если немного подумать, то всё это сокращается до:
str[i] && !isdigit(str[i])
http://www.c-cpp.ru/content/isdigit
!((str[i] >= '0' && str[i] <= '9') || str[i] == '\0') - применяем NOT (!) ко ВСЕМУ выражению
!(str[i] >= '0' && str[i] <= '9') || str[i] == '\0' - применяем NOT к ЧАСТИ выражения ДО ||
Если раскрыть скобки (зачем программистам математика?), то первое выражение равно:
!((str[i] >= '0' && str[i] <= '9') || str[i] == '\0') ==
!(str[i] >= '0' && str[i] <= '9') && !(str[i] == '\0') ==
!(str[i] >= '0' && str[i] <= '9') && str[i] != '\0'
А если немного подумать, то всё это сокращается до:
str[i] && !isdigit(str[i])
http://www.c-cpp.ru/content/isdigit
Виталий Мамчур
Спасибо и вам))
Просто упрости это условие, как написал Андрей...
while(!((str[i]>='0'&&str[i]<='9')||str[i]=='\0'))
выполнять цикл пока не достигнут конец строки
И значение str[i] находится в диапазоне "0".."9" ( то есть цифра )
потом все это отрицается.
Я бы отдельную функции применил isdigit
она библиотечная
cppstudio.com/post/968/
или буква isalpha
cppstudio.com/post/960/
насчет букв - не знаю работает ли она к кириллице
выполнять цикл пока не достигнут конец строки
И значение str[i] находится в диапазоне "0".."9" ( то есть цифра )
потом все это отрицается.
Я бы отдельную функции применил isdigit
она библиотечная
cppstudio.com/post/968/
или буква isalpha
cppstudio.com/post/960/
насчет букв - не знаю работает ли она к кириллице
||str[i]!='\0'
Вот эта часть условия это билет до конечной. Ты гарантировано просмотришь всю строку, до конца.
Вот эта часть условия это билет до конечной. Ты гарантировано просмотришь всю строку, до конца.
Если (не ((str[i] больше или равен '0' и str[i] меньше или равен '9') или str[i] равен '\0'))
Виталий Мамчур
А на человеческом языке?
Виталий Мамчур
вы сейчас просто продиктовали код
Ты не можешь понять часть этого, я вообще нифига в этом не понимаю.
Виталий Мамчур
¯\_(ツ)_/¯
Похожие вопросы
- помогите, кому не трудно, перевести с языка Pascal на язык СИ код программы
- объясните как именно работает цикл (int i = 0; i < N; i++) в этом коде, почему нельзя написать i+1, вместо i++
- Помогите разобраться с кодом. Ошибка в строчке for (int i = 0, i > 100, i++) {
- КАК С ГЕНЕРИРОВАТЬ ДВА МАССИВА ИЗ СЛУЧАЙНЫХ ЧИСЕЛ С ПОМОЩЬЮ RANDOM НА ЯЗЫКЕ СИ? Я смог только заполнить от 0 до 255
- Почему язык СИ такой сложный?
- в языке СИ (просто СИ!!!!) чем отличаются два цикла. for(t=0; t
- даны натуральные числа n и m(0 <=m <= 9)дополнить запись числа n в начале и в конце цифрой m
- Условие при котором отбираются слова 5 или более символов. Язык Си.
- Программирование на языке СИ с использованием подпрограммы-функции
- Программирование на языке Си. Нужна небольшая помощь.