моя программа c дает тот же результат расчета - PullRequest
0 голосов
/ 06 июня 2018
#include <stdio.h>
main()
{
    int a,b,c;
    printf("write two numbers");
    scanf("%d%d", &a,&b);
    c=a+b;
    printf("the sum of two numbers is%d",&c);
}

это мой используемый код.Я использую блоки кода для компиляции.

Ответы [ 6 ]

0 голосов
/ 06 июня 2018

& - это адрес оператора, который вы используете для функций, требующих указатель.

Подпись для scanf:

int scanf ( const char * format, ... );

Где ... означает, что требуются дополнительные аргументы и указатели,Почему указатели на scanf?Потому что аргументы - это аргументы, а не аргументы.В основном scanf должен знать тип и размер переменной.В противном случае, если, например, входные данные являются long long, но вы говорите, что это int, тогда не хватит места, зарезервированного для целочисленного результата.

Однако подпись для printf:

int printf ( const char * format, ... );

где ... означает дополнительные аргументы, содержащие «значение».Для printf вы передаете значение некоторого типа, это аргумент out.

Таким образом, вы передаете указатель в качестве дополнительного аргумента для scanf, но значение для printf.

Так что измените свой код следующим образом:

printf("the sum of two numbers is%d",c);

или

printf("the sum of two numbers is%d",a + b);

Значение, которое вы напечатали, было адресом переменной c.Это может быть любое положительное целое значение и зависит от того, где ваш компьютер решит сохранить переменную.

0 голосов
/ 06 июня 2018
  1. printf("the sum of two numbers is%d",&c); Как вы можете видеть, вы печатаете адрес c, выполняя '& c' вместо печати фактического значения.

  2. Иесли мы видим, что функция printf использует спецификатор формата %d для вывода адреса 'c'.Это даст вам целочисленное значение со знаком.Используйте %p для печати адресов указателей.

0 голосов
/ 06 июня 2018

вы видите, что строка scanf

scanf("%d%d", &a, &b); 

меняется на

scanf("%d %d", &a, &b);

между% d, вставьте символ пробела. Программа не может различить разницу между двумя входными значениями int.

0 голосов
/ 06 июня 2018
  1. Всегда проверьте возвращаемое значение scanf.У вас должно быть 2, если стандартный ввод можно было разобрать в 2 int с.Обратите внимание, что int может иметь диапазон от -32767 до +32767.Попробуйте вместо этого использовать long?

  2. Использовать c в printf - вывод значение int.Не передавайте адрес.В противном случае это неопределенное поведение .Некоторые люди могут предложить вам, что адрес из c выводится, но языковой стандарт ничего подобного не говорит, поэтому никто другой не должен.

  3. Измените функцию на int main().Это языковой стандарт;return 0; добавляется неявно в этой конкретной функции, если вы ее не предоставляете.

Последняя сложность: поведение a + b равно undefined , еслиэто превышает минимальный или максимальный размер int.В идеале вы должны остерегаться этого.Но, что удивительно, это сложная тема!См. Безопасное добавление целых чисел и подтверждение безопасности .

0 голосов
/ 06 июня 2018

Посмотрите на свои printf.Вы используете адрес оператора (&), этот оператор дает адрес своего операнда.Чтобы напечатать значение c, вам нужно изменить

printf("the sum of two numbers is%d",&c);

на

printf("The sum of two numbers is %d", c);
//                                     ^

Обновление: на основании ваших входных данных, я полагаю, вы тестируете это с недопустимыми входными данными,Убедитесь, что ваши входные данные: a, b и его добавление c не превышают действительное значение int, в противном случае вы обречены.

В качестве примечания для улучшения, вы можете изменитьВаша main() функция в

int main(void)    //or int main()

Это то, что рекомендует стандарт, и является широко обсуждаемой темой среди юристов-лингвистов.Прочитайте это для получения дополнительной информации.

0 голосов
/ 06 июня 2018

При использовании printf() вы печатаете местоположение вместо значения переменной c.Удалите &, чтобы получить фактическое значение c.

printf("the sum of two numbers is%d",c)
...