C 数据类型更改后程序不显示第一个操作数

C 数据类型更改后程序不显示第一个操作数,c,C,我目前正在自学一点C语言,并从可执行文件中收到了一个奇怪的响应。这是代码 #include <stdio.h> int main() { int a, b; /* the operands in the arithmetic */ while(1) { printf("\n\n\n enter two integers: "); scanf("%d %d", &a, &b); printf("\n %d +

我目前正在自学一点C语言,并从可执行文件中收到了一个奇怪的响应。这是代码

#include <stdio.h>

int main()
{
   int a, b;   /* the operands in the arithmetic */

   while(1) {
      printf("\n\n\n enter two integers: ");
      scanf("%d %d", &a, &b);
      printf("\n %d  +     %d is  %d", a, b, a + b);
      printf("\n %d  -     %d is  %d", a, b, a - b);
      printf("\n %d  *     %d is  %d", a, b, a * b);
      printf("\n %d  /     %d is  %d", a, b, a / b);
      printf("\n %d  mod   %d is  %d", a, b, a % b);
   }
   return 0;
}
正如您所看到的,输出是预期的。但是,当int替换为short并且没有进行其他更改时,程序将生成以下输出

输入两个整数:
32000 32000

32000 + 32000 is 64000
32000 - 32000 is 0
32000 * 32000 is 1024000000
32000 / 32000 is 1
32000 mod 32000 is 0
0 + 32000 is 32000
0 - 32000 is -32000
0 * 32000 is 0
0 / 32000 is 0
0 mod 32000 is 0
正如您可以清楚地看到的,即使32000在gcc文档所说的可以用短字符表示的范围内(即-32767到32767),程序也不再显示第一个操作数。我无法理解这一点

进一步的研究表明,对于scanf()函数,我应该使用包含格式规范修饰符h的命令,将%d替换为%hd。我的理解是,在scanf()中仅使用%d会导致编译器或硬件“丢弃”前两个字节

我真正感到困惑的是,考虑到scanf()使用了两个(不正确的)%d格式说明符实例,为什么只有第一个操作数受到影响

如果您能在这方面给予任何帮助,我们将不胜感激

致以最良好的祝愿


Stuart

编译器无法为您提供正确的结果,因为您(通过使用错误的格式说明符)欺骗了它

如果要输入一个
int
,请使用
“%d”
;如果要输入
短整数
,请使用
“%hd”


否则,您将导致未定义的行为,在这种情况下,从segfault到运行时崩溃都可能发生。请记住,未定义的行为不值得讨论。

编译器无法为您提供正确的结果,因为您(通过使用错误的格式说明符)欺骗了它

如果要输入一个
int
,请使用
“%d”
;如果要输入
短整数
,请使用
“%hd”


否则,您将导致未定义的行为,在这种情况下,从segfault到运行时崩溃都可能发生。请记住,未定义的行为不值得讨论。

我认为,当输入第二个变量
b
的值时,变量
a
占用的内存将被覆盖,反之亦然


如果使用超出数组可接受索引范围的无效索引,数组周围的内存也会被覆盖。

我认为当输入第二个变量
b
的值时,变量
a
占用的内存会被覆盖,反之亦然


如果使用超出数组可接受索引范围的无效索引,数组周围的内存也会被覆盖。

从一本好的C语言书中学习,而不是从在线教程中学习。这些教程是很好的参考,但会让你成为一个有很多漏洞的c程序员。嗨,Ashish,谢谢你的回复。我在自学。这是Kenneth E.Martin的“通过UNIX的C”。诚然,这是一本比较老的书,但确实需要我更多地思考语言内部的关系。在这种情况下,声明中使用的数据类型与要使用的最合适的格式说明符之间的关系,以及这对如何使用RAM意味着什么。还感谢您提供有关教程的提示。我会记住这一点。从一本好的C语言书中学习,而不是从在线教程中学习。这些教程是很好的参考,但会让你成为一个有很多漏洞的c程序员。嗨,Ashish,谢谢你的回复。我在自学。这是Kenneth E.Martin的“通过UNIX的C”。诚然,这是一本比较老的书,但确实需要我更多地思考语言内部的关系。在这种情况下,声明中使用的数据类型与要使用的最合适的格式说明符之间的关系,以及这对如何使用RAM意味着什么。还感谢您提供有关教程的提示。我会记住的。