C语言基础-数据和语句
3.1 基本数据类型
- 变量的3个属性:作用域,链接属性,存储类型。
- C语言仅含有4种基本数据类型:整形,浮点型,指针,聚合类型(如数组和结构等)。其他类型都是这几种类型的组合派生。
3.1.1 整型家族
- 整数类型包括:字符,短整型,整形,长整型。它们都有signed和unsigned两种版本。
整形变量的最小范围:
| 类型 | 最小范围 |
|---|---|
| char | 0~127 |
| signed char | -127~127 |
| unsigned char | 0~255 |
| short int | -32767~32767 |
| unsigned short int | 0~65535 (16bit) |
| int | -32767~32767 |
| unsigned int | 0~65535 |
| long int | -2147483647~2147483647 |
| unsigned long int | 0~4294967295 (32bit) |
- 枚举类型(enumerated)
enum color { red=8, blue, yellow };enum color tree1,tree2;
3.1.2 浮点类型 所有浮点类型至少能容纳 10^-37 ~ 10^37之间的任何值。
3.1.3 指针
- 字符串常量(string literal)
- 当一个字符串常量出现在一个表达式中时,表达式所使用的值就是这些字符所存储的地址。
- 因此可以把赋值字符给一个指向字符的指针,但是不能直接将字符串赋值给字符数组。要想赋值,用标准c函数库里的函数如strcpy()。
3.2 基本声明
相等的整形声明:
| short |short int |signed sort | signed short int | unsigned short | unsigned short int |
|---|---|
| int |signed int |signed | unsigned int | unsigned |
| long|long int |signed long | signed long int | unsigned long int | unsigned long |
3.2.1 声明指针
int *a,*b,c;
上式,a,b是指向int的指针,也就是地址。c是整型变量。 * 操作符是间接访问操作(indirection)。char *message = "hello world!";等同于下面的代码:char *message; message = "hello world!";
这里的message是一个指向字符的指针,并用字符串第一个字符的地址给message初始化。
3.3 typedef
为各种数据类型定义新的名字。
typedef char *ptr_char; ptr_char a,b,c;
上式三个a,b,c都是指向字符的指针。
3.4 常量
- 一般常量的初始化:可以在声明变量的时候初始化,或者函数形参const在被调用时会被实参赋值。
- const声明指针变量时
- a.
int * const tmp;可以修改指针的值,不能修改指针所指的值 - b.
int const *tmp;与a相反 - c.
int const * const tmp;都不可修改
- a.
3.5 作用域
- 代码块作用域(block scope):位于一对花括号之间的所有语句。
- 文件作用域(file scope):任何在代码块之外声明的标识符,这是标识符从他们声明处到原文件结尾都是可以访问的。
- 原型作用域(prototype scope):函数原型中声明的参数名(
int fun1( int prototype );) - 函数作用域(function scope):语句标签,用于goto语句。
3.6 链接属性
标识符的链接属性由三种:external,internal,none。
- 代码块之外都是external属性,代码块之内需要加上extern从internal变为external。对整个程序来说都是全局变量。
- 具有external属性的实体总是具有静态存储类型!
- 关键字:extern,static。
3.7 存储类型(storage class)
- 普通内存:即非堆栈的内存。凡是在代码块之外定义的都是静态变量,无法再指定其他存储类型,在程序运行之前创建,整个程序运行期间都存在。
- 堆栈:在代码块之内声明的变量的缺省存储类型都是automatic;关键字为auto,但很少用。可以给变量加上static 关键字改变存储类型,但不修改作用域 。形参不能声明为静态变量。
- 寄存器:用于自动变量的声明,提示存储在寄存器中而不是内存。
static关键字:
- 当static位于代码块之外时,只修改标识符的链接属性 (external->internal),并不改变存储类型和作用域。
- 当它作用于代码块内部时,static只修改变量的存储类型 (auto->static)并不改变链接属性和作用域。
4.1 空语句
空语句本身只包含一个分号,表示不执行任何任务。
例:while( getchar() != '\n') ;
4.2 表达式语句
- C语言并不存在专门的赋值语句,赋值在表达式里面进行。
- 注意下面语句也是合法的:
x * 4; getchar();
第一条语句虽然被执行但是没有任何效果,计算得到的结果并没有被保存下来。 printf("hello,world!");这条语句也跟上面类似,printf也有返回值(它实际打印字符的个数) 由于不关心这个值所以弃之不理。
4.3 switch语句
例:
switch ( command ){
case 1:
add();
break;
case 2:
sub();
break;
case 3:
/* fall thru */
case 4:
mul();
break;
default:
printf("wrong intput!");
exit();
}
4.4 goto 语句
一般不要使用goto语句,非常危险。
下面是一个可以使用goto语句的情况:
while( exp1 ){
while( exp2 ){
while( exp3 ){
if( back ) goto quit;
}
}
}
quit: ;
PS: 由于break语句只能影响包它的最内层的循环,要想立即跳出循环,可以使用goto语句。
也可以所有循环放在一个函数里,当需要从里层循环退出时,使用return语句离开函数。
C语言不具有任何输入输出语句和异常处理语句,都是通过调用函数库来完成的!!!
浙公网安备 33010602011771号