佛山做网站建设价格,设计图片用什么软件好,做网站的个人总结,视频教学网站开发需求分析C和C的关系
C继承了所有C语言的特性#xff1b;C在C的基础上提供了更多的语法和特性#xff0c;C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。
变化一#xff1a;所有变量都可以在使用时定义
C中更强调语言的实用性#xff0c;所有的变量…C和C的关系
C继承了所有C语言的特性C在C的基础上提供了更多的语法和特性C语言去除了一些C语言的不好的特性。C的设计目标是运行效率与开发效率的统一。
变化一所有变量都可以在使用时定义
C中更强调语言的实用性所有的变量都可以在需要使用时定义。我们都知道C语言都必须要在作用域之前的位置定义否则会报错。
引申概念什么是作用域 通常我们在写代码的时候所用到的名字并不是有效/可用的限定变量或者函数的名字的可用性的代码范围就叫作用域。全局变量作用域就是整个文件加了extern声明之后作用域就可以为整个工程空间使用。局部变量的作用域就是本函数内用完即丢弃。 范例
#include stdio.h
#include stdlib.h
int main(void)
{int c 0;printf(Begin...\n);for(int i0; i 10; i) //在C语言中变量定义需要在函数开始不能在使用的地方定义。{for(int j 0; j 10; j){c i*j;}}printf(c %d\n, c);printf(End...\n);return 0;
}C编译器也可以编译C代码通过Dev-C软件分别创建C工程和C工程C工程可以编译passC工程报错如下 注意使用ubuntu gcc编译能编译通过因为Dev-C 的C编译器和GUN gcc 编译器遵循的标准不一样。GUN gcc 对标准C进行了扩展。
变化二register关键字变化
C语言中register这个关键字请求编译器尽可能的将局部变量存在CPU寄存器中而不是通过内存寻址访问以提高效率。 注意是尽可能不是绝对。因为如果定义了很多register变量可能会超过CPU的寄存器个数超过容量。 C语言中无法取得register变量地址在C中依然支持register关键字。为了兼容C语言特性。 C编译器有自己的优化方式不使用register也可能做优化。 C中可以取得register变量的地址当C编译器发现程序中需要取register变量的地址时register对变量的声明变得无效。 早期C语言编译器不会对代码进行优化因此register变量是一个很好的补充。
#include stdio.h
#include stdlib.h
int main(void)
{register int c 0;printf(Begin...\n);printf(c %08X\n, c);printf(End...\n);return 0;
} 说明标准C不支持对register取地址。VC6.0有警告但是也可以获取寄存地址只是说明编译器对register变量有处理申请不掉register变量就变成普通变量。但是标准C是不支持的。
变化三同名的全局变量处理
在C语言中重复定义多个同名的全局变量是合法的最终会被链接到全局数据区的同一个地址空间上。在**C**中不允许定义多个同名的全局变量C拒绝这种二义性的做法。
#include stdio.h
#include stdlib.h
int c 1;
int c;//加上extern 关键字C可以编译通过表示在前面定义的。
int main(void)
{printf(Begin...\n);printf(c %08X\n, c);printf(End...\n);return 0;
}变化三 const 常量
在C中const修饰的变量是不允许再次赋值的但是可以通过指针操作const变量。const变量是只读变量有自己的存储空间。
#include stdio.h
//const int c 0;// const修饰全局变量不可用指针操作修改值会出现段错误。
int main(void)
{const int c 0;int *p (int*)c;*p 8;printf(c%d\n, c);return 0;
}在C中编译器对const常量处理
当碰见const声明时在符号表中放入常量编译过程中若发现使用常量则直接以符号表中的值替换编译过程中若发现对const使用了extern或者操作符则给对应的常量分配存储空间。 NoticeC编译器虽然可能为const常量分配空间但不会使用其存储空间中的值。 如果再到上面的代码中插入打印C常量地址操作
printf(c address %08X\n, c);最终打印如下 c0 c address EB6F729C
C中const变量是只读变量告诉编译器该变量不能出现在赋值符号左边本质是变量有自己的存储空间。C中const 是真正的常量当const常量为全局并且有extern关键字或者使用操作符取const常量地址时才会分配地址空间。 为什么C还要为const 常量分配地址空间呢因为为了兼容C。
范例加强const常量c和c的理解
#include stdio.h
int main(int argc, char *argv[])
{const int a 1;const int b 2;int array[a b]{0};int i 0;for (i 0; i (ab); i){printf(array[%d] %d\n, i, array[i]);}return 0;
}分别用gcc 和 g编译运行结果 C编译器直接报错无法确定数组array的大小因为const在c中本质是变量编译器无法知道数组array的大小变量只有在运行时候才知道值。 C编译器作为常量处理直接到符号表中取值所以array[ab] 就是array[12]. C中的const小结
const常量类似于宏定义const int c 0; ≈ #defin c 5c中的const常量与宏定义不同 const 常量是由编译器处理的提供类型检查和作用域检查。而宏定义由预处理器处理简单的文本替换。
范例
#include stdio.h
void f()
{#define a 3 //本意是想在本函数中使用a,作用域是该函数const int b 4;//该变量作用域为f函数
}void g()
{printf(a %d\n, a);//但是预编译器会直接替换掉a.printf(b d %d\n, b);//编译会报错因为编译器会对作用域进行检查
}int main(int argc, char *argv[])
{f();g();return 0;
}变化四struct类型的变化
C语言的struct定义了一组变量的集合C编译器并不认为这是一种新的类型。C中的struct是一个新类型的定义声明。
#include stdio.h
struct Student
{const char* name;int age;
};int main(int argc, char *argv[])
{Student s1 {Tom, 30};Student s2 {Tony, 28};return 0;
}C编译器认为Student 不是一个类型所以报错。C认为是一种新的类型可以直接赋值。
C中所有的变量和函数都必须要有类型。C语言中的默认类型在C中是不合法的。 范例
#include stdio.h
f(i) //C语言默认类型 int f(int i)
{printf(i %d\n, i);
}
g() //c语言默认类型 int g()
{return 5;
}int main(int argc, char *argv[])
{f(10);printf(g() %d\n, g());//printf(g() %d\n, g(1, 2, 3)); //在C中这里打开也能编译通过。反之在C中fail。return 0;
}在C语言中f(i) 和g()函数默认为 int f(int i) 和 int g(); g() 函数在C中可以接受任意的参数所以在调用的地方写g(1,2,3)也能通过只不过对传入的参数不处理。 如果C语言中想要表示不接受任何参数则需要在函数括号中加void。
思考int f();与int f(void); 的区别是什么
C语言中int f();表示函数可以接受任意的参数而 int f(void);表示调用时不接受任何参数否则就报错。C中int f();和int f(void) 都相同表示函数不接受任何参数。对类型检测加强。
总结
C 以C语言为基础进行了加强。C更强调实用性可以在使用的时候声明变量不需要在函数开头。C中register只是向C兼容C编译器能够进行更好的变量优化。C中的const是一个真正意义的常量而不是只读变量。C更加强调类型任何函数和变量都必须要指明类型。