1、整形、字符、布尔、浮点,这些可以成为基本数据类型。他们和字符串和数组有什么区别?
字符串和数组是一种复合型数据类型,他们由基本数据类型组成,一方面可以从整体上当做一个数据来使用,另一方面也可以分别访问它的各个组成单元。
函数名是什么的抽象?是多条语句组合起来的抽象表达。
结构体是一种数据类型的组合和抽象。
2、int main(void){
complex_struct{int x,y;} z;
int x;
}
z.x和x这两个x有什冲突吗,编译器是怎么区分这两个x的?变量z的成员变量x总是用"."这个符号来访问的,他们属于不同的命名空间。结构体中的成员变量xy的存储空间是相邻的。
但是:如果是枚举类型:
int main(void){
enum complex_type{a,b};
int a;
}
这样的定义就会出错。因为枚举的成员名a和变量名a在同一个命名空间,所以会引起冲突。
3、初始化时比如:complex_struct z={2,3};complex_struct z={2,3,};complex_struct z={};complex_struct z={2};这三种都是对的,也就是说,只能少不能多,不够的用0来补上。上面x,y分别等于:2/3 2/3 0/0 2/0
初始化时,如果用变量进行初始化如:void test(){int = 2; complex_struct z={n,3};},那么z必须是函数的局部变量才可以这样初始化,如果是全局变量就不行。
同样:void test(){ complex_struct z1={2,3};
complex_struct z2=z1;};}
z2必须是局部变量才能用z1来进行初始化。以这个道理,结构体可以作为函数的参数和返回值来传递。
struct complex_struct add_complex(struct complex_struct z1, struct complex_struct z2)
{
z1.x = z1.x + z2.x;
z1.y = z1.y + z2.y;
return z1;
} //这个函数实现了两个复数相加,如果在main函数中这样调用:
struct complex_struct z = { 3.0, 4.0 };
z = add_complex(z, z);
4、可以做算术运算的类型称为算术类型(ArithmeticType),算术类型包括整型和浮点型。可以做逻辑与、或、非运算的操作数或者if、for 、while的控制表达式的类型称为标量类型(Scalar Type),标量类型包括算术类型和以后要讲的指针类型。
结构体类型的值用在表达式中有很多限制,不像基本数据类型那么自由,比如+-*/ 等算术运算符和&&、|| 、! 等逻辑运算符都不能作用于结构体类型,if、while的控制表达
式的值也不能是结构体类型。
5、 All problems in computer science can be solved by another level of indirection
在写程序时注意分层来进行书写。这是一种抽象的编程思想,也就是说把可变的和不可变的分开来写。可变的是指一些被操作的数字,不可变的是指一种运算方式或者一些表达式或者某种运算方式或者是公式,就像我们再对一个复杂的表达式进行运算时,我们会先想办法把这个表达式给简化,然后再带进具体的参数。计算机编程也是这样:把数据的存储分为一层(也就是进行定义、初始化);把运算的表达分为一层即函数接口(也就是需要对这些数据进行哪些操作,要把这些操作的详细过程用函数的形式表达出来,而不是直接带入公式去进行运算,这样在需要某种运算时就可以直接调用这个函数。);把最终要实现的目标分为一层(就是我需要对这些函数进行怎样的操作,如加减乘除还是比较大小?,这层就可以称为实现层。)