江湖车侠|C和指针:如何快速上手C语言( 六 )


现在让我们进入有趣的部分 。 在大多数其他语言中,我们将像下面这个样子编写循环:
江湖车侠|C和指针:如何快速上手C语言它将读取一个字符 , 接下来如果我们尚未到达文件的末尾或读取的字符并不是换行符 , 它将继续读取下一个字符 。 注意这里两次出现了下面这条语句
江湖车侠|C和指针:如何快速上手C语言C可以把赋值操作蕴含于while语句内部 , 这样就允许程序员消除冗余语句 。
江湖车侠|C和指针:如何快速上手C语言一个经常问到的问题是:为什么ch被声明为整型,而我们事实上需要它来读取字符?答案是EOF是一个整型值,它的位数比字符类型要多,把ch声明为整型可以防止从输入读取的字符意外地被解释为EOF,但同时,这也意味着接收字符的ch必须足够大,足以容纳EOF ,这就是ch使用整型值的原因 。 正如第3章所讨论的那样,字符只是小整型数而已,所以用一个整型变量容纳字符值并不会引起任何问题 。
江湖车侠|C和指针:如何快速上手C语言
江湖车侠|C和指针:如何快速上手C语言return语句就是函数向调用它的表达式返回一个值 。 在这个例子里,变量num的值被返回给调用该函数的程序,后者把这个返回值赋值给主程序的n_columns变量 。
1.1.5 rearrange函数
江湖车侠|C和指针:如何快速上手C语言这些语句定义了rearrange函数并声明了一些局部变量 。 此处最有趣的一点是:前两个参数被声明为指针,但在函数实际调用时,传给它们的参数却是数组名 。 当数组名作为实参时,传给函数的实际上是一个指向数组起始位置的指针,也就是数组在内存中的地址 。 正因为实际传递的是一个指针而不是一份数组的拷贝,才使数组名作为参数时具备了传址调用的语义 。 函数可以按照操纵指针的方式来操纵实参,也可以像使用数组名一样用下标来引用数组的元素 。 第8章将对这些技巧进行更详细的说明 。
但是,由于它的传址调用语义,如果函数修改了形参数组的元素,它实际上将修改实参数组的对应元素 。 因此,例子程序把columns声明为const就有两方面的作用 。 首先,它声明该函数的作者的意图是这个参数不能被修改 。 其次,它导致编译器去验证是否违背该意图 。 因此,这个函数的调用者不必担心例子程序中作为第4个参数传递给函数的数组中的元素会被修改 。
江湖车侠|C和指针:如何快速上手C语言这个函数的真正工作是从这里开始的 。 我们首先获得输入字符串的长度,这样如果列标号超出了输入行的范围,我们就忽略它们 。 C语言的for语句跟它在其他语言中不太像,它更像是while语句的一种常用风格的简写法 。 for语句包含3个表达式(顺便说一下,这3个表达式都是可选的) 。 第一个表达式是初始部分,它只在循环开始前执行一次 。 第二个表达式是测试部分,它在循环每执行一次后都要执行一次 。 第三个表达式是调整部分,它在每次循环执行完毕后都要执行一次,但它在测试部分之前执行 。 为了清楚起见,上面这个for循环可以改写为如下所示的while循环:


推荐阅读