Почему здесь я получаю исключение с плавающей запятой (SIGFPE)?

Вопрос в том, чтобы подсчитать количество цифр в N, которое равномерно делит N. Это мой код для этого -

int evenlyDivides(int N){
    int temp = N;
    int residue;
    int count = 0;
    
    while(temp) {
        if (residue = temp % 10 && !(N % residue)) {
            count++;
        }
        temp /= 10;
    }
    
    cout << count;
}

Если переменная остатка когда-либо окажется равной нулю (скажем, N = 20), то она не выполнит первое условие оператора if и, следовательно, никогда не достигнет второго условия оператора if (где я нахожу N% остатка). Следовательно, я должен не получить исключение с плавающей запятой. Что мне не хватает?

Постарайтесь быть более щедрым на скобки.

user1095108 11.04.2023 23:15
residue = temp % 10 && !(N % residue) на самом деле не делает то, что вы думаете. На самом деле он не делает ничего, о чем можно было бы подумать, потому что это неопределенное поведение.
Sam Varshavchik 11.04.2023 23:18

Я буду честен с вами - не было бы проще просто использовать круглые скобки, чтобы получить желаемый результат, чем идти в StackOverflow, задавать вопрос и в этом процессе получать отрицательные голоса? Вы использовали их здесь: (N % residue), так почему бы не использовать их с другой стороны &&?

PaulMcKenzie 11.04.2023 23:24

См. Приоритет операторов C++

paddy 11.04.2023 23:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот что я получаю, когда создаю ваше приложение:

/*
 * BUILD:
 * c:\temp>g++ -g -Wall -pedantic -o x x.cpp
 * x.cpp: In function 'int evenlyDivides(int)':
 * x.cpp:9:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
 *     9 |         if (residue = temp % 10 && !(N % residue)) {
 *       |            ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */

Вот где он падает, когда я запускаю его (с N = 20):

if (residue = temp % 10 && !(N % residue)) { // SIGFPE here: temp=2, residue=0

ПРЕДЛАГАЕМОЕ ИЗМЕНЕНИЕ:

if ((residue = temp % 10) && !(N % residue)) { ... }
Ответ принят как подходящий

Ваш трюк понятен, но обычно это плохая практика присваивать оператору if из-за множества возможных типов ловушек. Ваш код является одним из образцов, почему.

Компилятор обрабатывает:

if (residue = temp % 10 && !(N % residue))

как

if (residue = (temp % 10 && !(N % residue)) )

что вполне логично в свете приоритета оператора C++.

Возможное решение:

int evenlyDivides(int N){
    int temp = N;
    int residue;
    int count = 0;
    
    while(temp) {
        residue = temp % 10;
        if (residue % 10 && !(N % residue)) {
            count++;
        }
        temp /= 10;
    }
    
    cout << count;
}

Для хорошего ответа покажите, как решить проблему.

Pete Becker 12.04.2023 01:50

@PeteBecker, готово, хотя я был уверен, что лучше оставить место для домашней работы, чтобы убедиться, что человек усвоил ее и выучил наизусть на практике. Обратите внимание, его вопрос был «Что мне не хватает?», а не «Как это реализовать?».

Damir Tenishev 12.04.2023 02:04

Другие вопросы по теме