虽然我读一些C教程,我发现这条线,我不明白:c中的范围检查是什么?
C不范围检查
这是什么意思?
另一个小问题:如何在完成后暂停代码不要很快终止?我想我们说System("PAUSE")
或类似的东西。我怎样才能在C?
虽然我读一些C教程,我发现这条线,我不明白:c中的范围检查是什么?
C不范围检查
这是什么意思?
另一个小问题:如何在完成后暂停代码不要很快终止?我想我们说System("PAUSE")
或类似的东西。我怎样才能在C?
这意味着您可以定义逻辑结果超出该类型允许的值范围之外的操作。例如
unsigned char a = 0xFF;
unsigned char b = a + 1;
编译器会非常高兴地允许这个,并返回0x00
的结果。 0xFF + 1
溢出一个字节存储的a。请注意,0x00只是正确答案'0x100'的低8位。
unsigned char a = 0xFF;
unsigned b = (unsigned)a + 1;
,其通过将其转换为更大的整数类型,并保存到一个较大型的第一使得用于在该值更大的空间:这可以通过进行修补。
类似的问题是边界检查在编译器会很乐意让你写:
int a[5] = {1, 2, 3, 4, 5};
i = 1000;
b = a[i];
(编辑基于评论:) 这段代码执行后,异常可能会被抛出,但编译器根本不在乎。
或者只是'unsigned b = a + 1',因为当值'0x100'被存储到'b'时,第一个例子中的绕回发生(假设'CHAR_BIT == 8'),而不是当'1'被添加到'0xFF'时。 – 2011-12-22 12:22:16
@SteveJessop好点。 – 2011-12-22 12:23:23
正如WTP在您删除的答案中所说的那样,'b'不保证在数组末尾有995个字的任意值。代码的行为是未定义的。它可能会崩溃,着火,为堆栈溢出等引发硬件异常,而不是将“b”设置为任何值。 – 2011-12-22 12:25:49
在Windows上,如果您有#included stdlib.h,您可以经常说系统(“暂停”)使环境等待您按回车。但是,您应该注意以下事项:
它不被认为是近好的做法任何地方依靠pause.exe命令在当前环境中存在。在大多数Windows系统上可能都是如此,但在Unices或Mac上通常不适用。所以你会限制你的便携式程序到一个单一的平台。
您可能想要考虑为什么您希望用户按Enter键。大多数人认为,如果程序开始工作,然后退出,这很好。 “真实”的程序以这种方式等待用户确认是非常罕见的。如果你只是想看看DOS提示符在它自己关闭之前说了些什么,也许问题出在DOS提示符而不是你的程序上?
我记得在开始编程时询问同样的问题,但后来我意识到在大多数情况下暂停程序是错误的。
我一直在想为什么人们使用'system(“pause”);'? 'getchar()'有问题吗?非便携性是可取的还是什么? – Dave 2011-12-22 16:38:09
@Dave输入缓冲区中可能存在文本,在这种情况下,getchar()不执行任何操作。我记得在C++中,获取输入的cin >>方法会在缓冲区中留下换行符,从而导致该技术失败。 – jforberg 2011-12-22 16:53:05
然后'while(getchar()!= EOF);'应该这样做。这主要是因为IDE可以看到他们程序的输出,而按下'ctrl-d'并不难。 – Dave 2011-12-22 17:42:20
每个问题请提出一个问题。 C教程很愚蠢;得到一本书。作者可能在谈论如何在访问时未验证数组边界。为什么这个标记为C++?不要在程序中实现暂停;如果它在执行后消失,则是环境的错误,因此修复环境。 – 2011-12-22 12:05:12
@ TomalakGeret'kal请对每条评论发表一条评论;) – MByD 2011-12-22 12:07:10
@BinyaminSharet:;) – 2011-12-22 12:07:30