2 + 2 = 2 в С (двойная арифметика) - PullRequest
0 голосов
/ 15 октября 2011

Я понятия не имею, почему он возвращает 2 для a=2 и b=2 ..

Есть идеи?

#include <stdlib.h>

int main()
{
    double a,b,c;
    printf("a=");
    scanf("%d", &a);
    printf("b=");
    scanf("%d", &b);
    printf("c=");
    scanf("%d", &c);

    printf("x=%d", a+b);

    return 0;
}

Ответы [ 4 ]

2 голосов
/ 15 октября 2011

%d для чтения целых чисел, используйте %f или %lf для числа с плавающей запятой / double.

2 голосов
/ 15 октября 2011

Спецификатор "%d" ожидает целое число, и вы передаете адрес double.Использование неправильных спецификаторов в scanf приводит к неопределенному поведению.

Кроме того, использование неправильного спецификатора в printf - это то же самое.Поскольку printf принимает переменное число аргументов, a + b, которое является двойным, не может быть преобразовано в целое число.

1 голос
/ 15 октября 2011

Если вы хотите принять ввод с плавающей запятой, используйте scanfprintf) с символом форматирования %lf, а не %d (что для целых чисел).

Поведениеваша текущая программа не определена, так как вызовы scanf записывают целое число в переменную типа float.Кроме того, вам не хватает include <stdio.h> в верхней части вашей программы.Чтобы отлавливать подобные ошибки, включите предупреждения в своем компиляторе C:

$ gcc so-scanf.c -Wall
so-scanf.c: In function ‘main’:
so-scanf.c:6:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
so-scanf.c:6:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
so-scanf.c:7:5: warning: implicit declaration of function ‘scanf’ [-Wimplicit-function-declaration]
so-scanf.c:7:5: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]
so-scanf.c:7:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘double *’ [-Wformat]
so-scanf.c:9:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘double *’ [-Wformat]
so-scanf.c:11:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘double *’ [-Wformat]
so-scanf.c:13:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]
1 голос
/ 15 октября 2011

printf должен использовать что-то вроде %f вместо %d.То же самое для scanf.

...