Ошибка C , которую я не понимаю

#c

#c

Вопрос:

Итак, это мой код

 #include "stdafx.h"
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int kol=0, x;

cout << "Insert a number: ";
cin >> x;

while (x > 0);
{
    div_t output;
    output = x;
    x = div(output, 10);
    kol  = kol;
}
cout << "Amount: " << kol << endl;
system ("pause");
return 0;
}
  

И я получил эту ошибку:
Ошибка 1 ошибка C2679: двоичный файл ‘=’: не найден оператор, который принимает правый операнд типа ‘int’ (или нет приемлемого диалога)

Может кто-нибудь сказать мне, что я сделал не так, и как это исправить?

Комментарии:

1. x — это тип int , который вы назначаете для вывода, который является типом div_t , div_t operator= имеет ли значение an int (или что-то еще, что имеет неявное преобразование из int )?

2. Программирование путем угадывания не работает. Что было output = x предназначено для выполнения, и где вы прочитали, что это должно быть сделано таким образом? Нам нужно исправить этот ресурс. Также, пожалуйста, сделайте так, чтобы ваш заголовок описывал вопрос; «ошибка, которую я не понимаю» в списке вопросов никому не помогает.

Ответ №1:

Вы обрабатываете div_t как int; это не так. Это структура.

Смотрите http://en.cppreference.com/w/cpp/numeric/math/div

Можете ли вы объяснить, что вы пытаетесь сделать? Очевидно, что предполагается повторяющееся разделение, но это все, что я предполагаю.

Комментарии:

1. Немного больше примеров кодирования, как исправить источник OP, сделало бы ваш ответ действительно отличным,

Ответ №2:

output является div_t . x это an int , so output = x похоже на попытку присвоить яблоко апельсину. Вы не можете этого сделать, не установив набор правил для превращения яблока в апельсин.

Мы могли бы попытаться написать такое правило, но зачем беспокоиться? Вместо этого давайте посмотрим на код, который привел нас в это затруднительное положение, и попытаемся выяснить контекст.

 while (x > 0);
{
    div_t output;
    output = x;
    x = div(output, 10);
    kol  = kol;
}
  

Цель этого цикла, по-видимому, состоит в том, чтобы подсчитать количество раз x , которое было разделено на десять, и сохранить количество kol .

div_t является результатом вызова div , поэтому присвоение значения результату перед выполнением операции, которая сгенерирует результат, является необычным. Возможно, OP имел в виду

 while (x > 0);
{
    div_t output;
    output = div(x, 10);
    kol  = kol;
}
  

разделить x на десять и получить частное и остаток.

Но этот цикл никогда не завершится, потому x что он никогда не изменяется. Если оно не равно нулю, цикл никогда не завершится, а если оно равно нулю, цикл никогда не войдет. Возможно

 while (x > 0);
{
    div_t output;
    output = div(x, 10);
    x = output.quot;
    kol  = kol;
}
  

было бы более уместно. Однако остаток никогда не используется, поэтому div эффективно тратится впустую и

 while (x > 0);
{
    x = x / 10; // or x /= 10;
    kol  = kol;
}
  

обеспечит тот же результат с гораздо меньшим количеством хлопот.