2012年5月5号;
问题:for语句和while语句后面有; 的情况。相当于
这是执行空循环,i会累加,但啥都不执行。直到不满足条件为止。
for(;;) ;
while() ;
2012年5月10号;
今天开始看《计算机程序设计艺术》,里面讲到算法的几重特性,其中的efficiency在谭浩强著《C程序设计》中被举例a/b的条件是b!=0,而原文中说的是诸如哥德巴赫猜想,翻译过来大致是“你不能写一条语句说当n=4时,若x^n+y^n+z^n=w^n,则继续”,因为这条语句计算机是无法一步实现的,所以是无效的。不知道中文版教材是不是曲解了原著的意思。
2012年5月18号;
C语言的一致性
遵循标准的C实现有两种:宿主式和独立式。
如果一个C实现接受所有严格遵循标准的程序,它就是一种遵循标准的宿主式实现。如果一个C实现接受所有严格遵循标准并且不适用除了float.h,iso646.h(C95),limits.h,stdarg.h(C99),stdbool.h和stdint.h(C99)之外的任何库函数的程序,她就是一种遵循标准的独立式实现。
一致性程序就是可以被一致性编译器所接受的程序。因此,一致性程序可以依赖于一致性C实现中一些非移植性的、由编译器所定义的特性。严格一致性程序则无法依赖这些特性(因此具有最大限度的可移植性)。这里我的观点就是比如graphic.h是Turbo C++的特征库函数,在其他编译器中没有,这样调用这个库函数的程序的可移植性就差,所谓的严格一致性指的是与C标准的严格一致,不含有C标准以外的任何库函数及特性。(不知道我的理解是不是有错误,希望看到的人能给予指正。)参考自《C语言参考手册(第五版)》。
void (*Fun)(); void myfunction() { printf("这是为什么呢?\n"); } int main() { Fun ptr = myfunction; ptr();//能输出结果 (*ptr)();//也能输出结果 return 0; }
因为在C/C++中,在表达式中函数名得到的就是函数的地址, 这也是为什么可以把一个函数名赋值给一个函数指针的原因. 也就是说,函数名就跟数组名一样, 本身在表达式中是地址, 而不是值.double (*pfun) (double) = func; 而不需要 = &func; 因为&func 如果按照普通变量地址来解释, 语义上是行不通的, 所以标准规定 func == &func; 对函数指针进行调用的时候也就 *pfun() == pfun() 了.
2012年6月4日
//编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。 #include<stdio.h> struct Student { char num[5]; char name[8]; int score[3]; }student[5]; void main() { void print(struct Student student[5] ); int i,j; for(i=0;i<5;i++) { printf("\n请输入学生的学号:%d\n",i); printf("学号:"); scanf("%s",student[i].num); printf("姓名:"); scanf("%s",student[i].name); for(j=0;j<3;j++) { printf("科目 %d:",j); scanf("%f",&student[i].score[j]); } printf("\n"); } print(student); } void print(struct Student student[5]) { int i,j; printf("学号 姓名 科目 1 科目 2 科目 3\n"); for(i=0;i<5;i++) { printf("%5s%10s",student[i].num,student[i].name); for(j=0;j<3;j++) { printf("%d",student[i].score[j]); } printf("\n"); } }
这个代码用gcc struct.c 后./a.out执行没有问题。但是用gcc -o struct.c 后执行./struct就有问题。目前未明白问题原因。