C语言中遇到的问题及解决方法

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

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就有问题。目前未明白问题原因。

你可能感兴趣的:(学习笔记)