我正在使用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
结果。
答案 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);
)为例:
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);
这将起作用。
另外,我建议使用浮点/双精度类型来存储除法结果,因为除以两个整数会将结果本身转换为整数。