每当我执行代码时,都会收到“ -317629566”

时间:2019-01-04 15:28:01

标签: c

我正在使用dev ++进行c编程,并且我已经对add,subtract,multi和div进行了简单的编程。我的代码没有错误,但是我在输出屏幕中得到了另一种类型的9位数(-317629566)消息以及输出。

#include<stdio.h>
#include<conio.h>

main()
{
    int a, b;
    char op;

    printf("select a operator(+, -, *, /) :: ");
    scanf("%c", &op);
    printf("enter first number : ");
    scanf("%d", &a);
    printf("enter second number : ");
    scanf("%d", &b);

    switch (op)
    {
        case '+':
            printf("addition : %d%d", a + b);
            break;
        case '-':
            printf("subtraction : %d%d", a - b);
            break;
        case '*':
            printf("multiplication : %d%d", a *b);
            break;
        case '/':
            printf("divison : %d%d", a / b);
            break;
        default:
            printf("not a operator");
    }
    getch();
}

这是我执行代码后得到的输出。

select a operator( + , - , * , / ) :: +
enter first number : 12
enter second number : 13
addition : 25-317629566

为什么我得到这个-317629566结果。

3 个答案:

答案 0 :(得分:0)

printf("addition : %d%d", a + b);

您要printf打印两个整数,但是您只传递了一个。这会导致不确定的行为。在这种情况下,它只是打印一个任意值,但可能会发生更糟的情况。

答案 1 :(得分:0)

正如我在评论中所写,所有4个 printf 语句(在 switch 块内部)都是错误的。

根据[CPPReference]: std::printf, std::fprintf, std::sprintf, std::snprintf强调是我的):

  
      
  • ... -指定要打印数据的参数。如果default conversions之后的任何参数不是相应的转换说明符所期望的类型,或者如果参数少于格式要求的参数,则行为未定义。如果参数超出格式要求,则多余的参数将被评估并忽略
  •   

让我们以第一个 st printf("addition : %d%d", a + b);)为例:

  • 您的字符串格式( printf 的1 st 参数)包含 2 %d (十进制)转换说明符,这意味着 printf 后面应为 2 个整数值
  • a + b仅产生 1 整数值,您属于未定义行为分支。在这种情况下, printf 输出垃圾数据(来自某个“随机”内存地址),但请记住,在某些情况下程序可能会崩溃

为了解决问题:

  • 请确保转换说明符编号与遵循以下格式的参数编号(也要注意其类型)相匹配:printf("addition : %d", a + b);

  • 为了更进一步,为了获得格式正确的输出,请添加“ \ n ”( LF 0x0A EOLN )字符放在格式字符串的末尾:遇到这样的字符时,它不会显示在屏幕上,但是光标会跳到下一行的开头:printf("Addition: %d\n", a + b); < / p>

  • 要想进一步了解,您还可以打印得出此结果的数字:printf("Addition: %d + %d = %d\n", a, b, a + b); 3 %d < / em> s,格式说明符后3个整数)

作为最后的提示(与问题本身无关),当 b 为0时,您可能希望避免除法。

答案 2 :(得分:-1)

问题出在显示数据的方式上:

printf("addition : %d%d", a + b);

如果只输出一件事,则仅使用一个格式说明符。

printf("addition : %d", a + b);

这将起作用。

另外,我建议使用浮点/双精度类型来存储除法结果,因为除以两个整数会将结果本身转换为整数。