функция кодовых блоков не работает в c

Я использую кодовый блок для обучения c. мой код

#include<stdio.h>
#include<math.h>
int main()
{
  int x;
  x = pow(5,2);
  printf("%d", x);
}

Output is 25

Когда я использую этот код

#include<stdio.h>
#include<math.h>
int main()
{
  int x,i,j;
  printf("please enter first value");
  scanf("%d", &i);//5
  printf("please enter second value");//2
  scanf("%d", &j);
  x = pow(i,j);
  printf("%d", x);
}

Output is 24

что здесь не так? Я просто беру значение с помощью функции сканирования, а также с помощью функции Pow таким же образом.

 fvu24 февр. 2013 г., 12:00
@junix, потому что какой бы тип ты ни шлепнул перед ним, паубудем вернуть double изначально - и как double -> int - это просто усечение, некоторая странность в платформе OP МОЖЕТ вызвать 5 ^ 2 24.99999, который как int равен 24.
 Mats Petersson24 февр. 2013 г., 12:34
Учитывая использование printf, scanf и включение файлов ".h", я бы сказал, что это C, а не C ++.
 cIph3r24 февр. 2013 г., 11:52
работает для меня, но вы должны вернуть 0 в конце вашего основного метода
 fvu24 февр. 2013 г., 11:53
Посмотрите насправочная страница - прототип Пауdouble pow(double x, double y);, Начните с использования правильных типов.
 juanchopanza24 февр. 2013 г., 11:59
Вы должны выбирать между C или C ++, а не обоими. В противном случае вы получите запутанные комментарии и ответы, такие как «вы забыли вернуть 0», что не относится к C ++. В настоящее время это вопрос C.

Ответы на вопрос(5)

Попробуйте изменить инициализацию на это:

int x=-1 ,i=-1 ,j=-1;

И последний отпечаток к этому:

printf("pow(%d, %d) == %d\n", i, j, x);

Это должно дать хороший намек на проблему. Кроме того, проверьте возвращаемые значенияscanf, они должны вернуть количество прочитанных элементов, т.е. 1 с кодом выше.

Почти наверняка вы ввели неверный ввод для scanf, иi или жеj были оставлены неинициализированными, а эти 24 - просто мусорное значение.

Кроме того, скомпилируйте с включенными предупреждениями и исправьте их (например, добавитьreturn 0; до концаmain).

 KillianDS24 февр. 2013 г., 12:01
Или научитесь использовать отладчик и проверять переменные после сканирования.

что во второй программе нет ничего плохого, кроме того, что вы должны добавить в конце

return 0;

Если вы прочитаете значение j с 2, то результат будет только 25.

я получил результат 25, который является правильным. Хотя попробуйте изменить тип данных результата, таких как float или double.

Вы, вероятно, должны запустить его снова, чтобы увидеть, если вы просто прочитали это неправильно ...
Недостающий "return 0;" здесь не проблема

Если что-нибудь может пойти не так,
Вы можете попробовать добавить

fflush(stdin);//or out

после очень scanf и printf. Если какой-либо из сбрасываний решает вашу проблему, вы знаете, что происходит не так.

Я подозреваю, что у вас есть наивная реализацияpow в вашейlibm (Получаю 25, как и должно быть). Если это вычисляетpow(x,y) какexp(y*log(x)) для позитиваx без проверки (малых) интегральных показателей и их особой обработки вы получаете

Prelude> 2 * log 5
3.2188758248682006
Prelude> exp it
24.999999999999996

a double результат немного меньше 25, поэтому, когда это преобразуется вint усечено до 24

Для проверки присвойте результатpow(i,j) кdouble и распечатай это.

С жестко закодированнымpow(5,2)компилятор (скорее всего, это то, что делает gcc даже без оптимизации) точно вычисляет результат во время компиляции.

Ваш ответ на вопрос