C是只能使用标量的语言

来源:互联网 发布:淘宝宝贝怎么编辑尺寸 编辑:程序博客网 时间:2024/06/10 22:43
 

本文所属图书 > 征服C指针

本书被称为日本最有营养的C 参考书。作者是日本著名的毒舌程序员,其言辞犀利,观点鲜明,往往能让读者迅速领悟要领。书中结合了作者多年的编程经验和感悟,从C 语言指针的概念讲起,通过实验一步一步地为我们...  立即去当当网订购

对于标量(scalar)这个词,大家可能有些陌生。

简单地说,标量就是指char、int、double和枚举型等数值类型,以及指针。相对地,像数组、结构体和共用体这样的将多个标量进行组合的类型,我们称之为聚合类型(aggregate)。

早期的C语言一度只能使用标量。

经常听到初学者有以下的提问:

if (str == "abc")

这样的代码为什么不能执行预期的动作呢?确实已经将“abc”放到了str中,条件表达式的值却不为真。这是为什么?

对于这样的疑问,通常给出的答案是“这个表达式不是在比较字符串的内容,它只是在比较指针”,其实还可以给出另外一个答案:

字符串其实就是char类型的数组,也就是说它不是标量,当然在C里面不能用==进行比较了。

C就是这样的语言,一门“不用说对于输入输出,就连数组和结构体也放弃了通过语言自身进行整合利用”的语言。

但是,如今的C(ANSI C)通过以下几个追加的功能,已经能够让我们整合地使用聚合类型了。

结构体的一次赋值

将结构体作为函数返回值传递

将结构体作为函数返回值返回

auto变量的初始化

当然,这些都是非常方便的功能,如今已经可以积极地使用了(不如说应该去使用)。可是在早期的C语言里,它们是不存在的。为了理解C语言的基本原则,了解早期的C语言也不是什么坏事。

特别要提出来的是,即使是ANSI C,也还不能做到对数组的整合利用。将数组赋值给另外一个数组,或者将数组作为参数传递给其他函数等手段,在C语言中是不存在的。

但是,因为结构体是可以被整合利用的,所以在实际的编程中,应该积极地使用其可用的功能。直到现在,还经常能看到使用memcpy()来进行结构体一次赋值的例子,真是做无用功。如果想要复制结构体,还是让我们使用结构体一次赋值这个功能吧。