C语言中的边界计算与不对称边界(一)

1、如果一个数组有10个元素,那么这个数组下标的允许取值范围是什么呢?

这个问题对于不同的程序设计语言有着不同的答案。例如,对于Fortran,PL/I以及Snobol4等程序语言,这个数组的下标取值缺省从1开始,而且这些语言也允许编程者另外指定数组下标的起始值。而对于Algol和Pascal语言,数组下标没有缺省的起始值,编程者必须显式的指定每个数组的下界与上界。在标准的Basic语言中,声明一个拥有10个元素的数组,实际上编译器分配了11个元素的空间,下标范围从0到10。

在C语言中,这个数组的下标范围是从0到9。一个拥有10个元素的数组中,存在下标为0的元素,却不存在下标为10的元素。C语言中的一个拥有n个元素的数组,却不存在下标为n的元素,它的元素的下标范围是从0到n-1为此,由其他程序语言转而使用C语言的程序员在使用数组时特别要注意。

例如:

int i, a[10];
for(i=1; i<=10; i++)
    a[i] = 0;

这段代码本意是要设置数组a中所有元素为0,却产生了一个出人意料的“负效果”。在for语句的比较部分本来是i<10,却写成了i<=10,因此实际上并存在a[10]被设置为0,也就是内存中在数组a之后的一个字的内存被设置为0。如果用来编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么内存中数组a之后的一个字实际上是分配给了整型变量i。此时,本来循环计数器i的值为10,循环体内将并不存在的a[10]设置为0,实际上却是将计数器i的值设置为0,这就陷入了一个死循环。

C语言中的边界计算与不对称边界(一)

时间: 2024-08-13 12:36:57

C语言中的边界计算与不对称边界(一)的相关文章

C语言中边界计算与不对称边界(二)

尽管C语言的数组会让新手感到麻烦,然而C语言中数组的这种特别的设计正是其最大优势所在.要理解这一点,以下是一些简单解释. 在所有常见的程序设计错误中,最难于察觉的一类是"栏杆错误",也常被称为"差一错误"(off-by-one error).例如这个问题:100英尺长的围栏每隔10英尺需要一根支撑用的栏杆,一共需要多少根栏杆呢?如果不加思索,大家会容易以为是100除以10,即为10根.其实,真正需要的是11根. 因为支撑10英尺长的围栏实际需要2根栏杆,即两端各一根

C语言中复数运算及调用blas,lapack中复数函数进行科学计算

C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计算. 1.C语言中的复数运算. C语言中若要用的复数,需要包含头文件complex.h,下面看看一些基本的例子 #include <stdio.h> #include"complex.h" int main() { complex a, b, c, d, f; a = 1 +

Java语言中的正则表达式

正则表达式是什么? 正则表达式是一种强大而灵活的文本处理工具.初学正则表达式时,其语法是一个难点,但它确实是一种简洁.动态的语言.正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题:匹配.选择.编辑以及验证.一般来说,正则表达式就是以某种方式来描述字符串. 日常例子 在文本中查找“halu126”,我们通常会在查找框中输入“halu126”,这就是一个最简单的正则表达式的例子,使用精确的匹配这样的字符串,如果我 们即想在文本中找到“halu126”,又想找到“Halu126”,

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

c语言中结构体指针

1.指向结构体的指针变量: C 语言中->是一个整体,它是用于指向结构体,假设我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到指向运算符"->". 举例说明: struct SunLL { int a; int b; int c; }; struct SunLL  * p;               //定义结构体指针 struct SunLL A = {1,2,3};    //定义一个SunLL类型的变量A

C语言中内存分配那些事儿

C程序的内存结构 C语言的之所以复杂,首先它的内存模型功不可没.不像某些那样的高级语言只需要在使用对象的时候,用new创建.所有之后的事情,你不需要操心.对于C语言,所有与内存相关的东西,都需要熟悉,否则,时间一久,总会踩着雷.下图是典型的一个C程序的内存结构,当然还有一个重要的前提,这样的一种布局是在虚拟内存中的: 关于虚拟内存内核维护了一个页表(page table),用来表示虚拟内存对物理内存地址或者磁盘(交换区,swap area)间的一种映射关系.并非所有的虚拟地址都需要在物理内存上映

Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

Coursera-Getting and Cleaning Data-Week4 Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周课程主要针对text进行处理.里面包括 1.变量名的处理 2.正则表达式 3.日期处理(参见swirl lubridate包练习) 首先,变量名的处理,奉行两个原则,1)统一大小写tolower/toupper:2)去掉在导入数据时,因为特殊字符导致的合并变量 3)不要重复:4)少用代码缩写 使用的函数包括 替换查找:

[转]C语言中自增自减运算符教学探究-中国论文网

摘要:C语言教学中,自增自减运算符运用得非常广泛,且具有一定的使用技巧和难度.在诸多运算符中,自增自减运算符是学生最难理解和最易出错的运算符.对自增自减运算符的功能和具体应用进行探究,以期为提高C语言教学效果提供帮助.中国论文网 http://www.xzbu.com/8/view-3865031.htm 关键词:C语言:自增自减运算符:教学效果 中图分类号:G434文献标识码:A文章编号:1672-7800(2012)012-0188-02 0引言 C语言编程设计中,若合理使用自增自减运算符,

C语言中随机数相关问题

用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand(unsigned int seed); //为rand设置"种子"的值 srand()就是给rand()提供种子seed,如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的.通常的做法是以这样一句代码: srand((unsigned)time(NULL)); 来取