Другие языки программирования и технологии

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/ - Демо.
Торгсервис Торгсервис
Торгсервис Торгсервис
62 360
Лучший ответ
Виталий Мамчур Огромное спасибо вам за развернутый ответ, но как я понял! просто поменяет || на && и тогда все становится ясно
Не "пока стр не равно числовому символу или стр не равно нуль символу" , а пока элемент строки с индексом i "не равен.... и т. д."
Вл
Владимир
56 196
Виталий Мамчур это понятно, но мне нужно суть понять, я оказывается не знал что || поменяется на && если перед ним поставить !
Приоритет '!' ВЫШЕ приоритета '||'.

!((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
Виталий Мамчур Спасибо и вам))
Просто упрости это условие, как написал Андрей...
Антон Нечей
Антон Нечей
56 043
while(!((str[i]>='0'&&str[i]<='9')||str[i]=='\0'))
выполнять цикл пока не достигнут конец строки
И значение str[i] находится в диапазоне "0".."9" ( то есть цифра )
потом все это отрицается.
Я бы отдельную функции применил isdigit
она библиотечная
cppstudio.com/post/968/
или буква isalpha
cppstudio.com/post/960/
насчет букв - не знаю работает ли она к кириллице
ƏL
Ə L I A Ğ A Hüseynov
97 946
||str[i]!='\0'
Вот эта часть условия это билет до конечной. Ты гарантировано просмотришь всю строку, до конца.
Если (не ((str[i] больше или равен '0' и str[i] меньше или равен '9') или str[i] равен '\0'))
Виталий Мамчур А на человеческом языке?
Виталий Мамчур вы сейчас просто продиктовали код
Ты не можешь понять часть этого, я вообще нифига в этом не понимаю.
Rinat Neyassov
Rinat Neyassov
548