C语言 goto void extern sizeof enum typedef分析
2016-07-25 17:29
253 查看
goto void extern sizeof 分析
遭人遗弃的goto
高手潜规则:禁用goto
项目经验:程序质量与goto的出现次数成反比
最后的判决:将goto打入冷宫
goto副作用分析
#include <stdio.h>
void func(int n)
{
int* p = NULL;
if( n < 0 )
{
goto STATUS;
}
p = malloc(sizeof(int) * n);
STATUS:
p[0] = n;
}
int main()
{
f(1);
f(-1);
return 0;
}
-------------------------------------------------------------------------------------------
void的意义
void修饰函数返回值和参数
--如果函数没有返回值,那么应该将其声明为void
--如果函数没有参数,应该声明其参数为void
void修饰函数返回值和参数仅为了表示无。
不存在void变量
--C语言没有定义void究竟是多大内存的别名。
没有void的标尺无法在内存中裁剪出void对应的变量。
void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void* 指针作为左值用于接收任意类型的指针
void* 指针作为右值赋值给其它指针时需要强制类型转换
int *pI = (int *)malloc(sizeof(int));
char *pC = (char *)malloc(sizeof(char));
void *p = NULL;
int *pni = NULL;
char *pnc = NULL;
p = pI; //ok
pni = p; //oops!
p = pC; //ok
pnc = p; //oops!
-------------------------------------------------------------------------------------------
extern中隐藏的意义
extern用于声明外部定义的变量和函数
extern用于告诉编译器用C方式编译
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,
通过extern关键字可以命令编译器“以标准C方式进行编译”。
extern "C"
{
int f(int a,int b)
{
return a+b;
}
}
-------------------------------------------------------------------------------------------
为sizeof正名
sizeof是编译器的内置指示符,不是函数
sizeof用于计算相应实体所占的内存大小
sizeof的值在编译器就已经确定
我是sizeof,不是函数
-------------------------------------------------------------------------------------------
enum是一种自定义类型
真正的常量不等同于const 变量
enum默认常量在前一个值的基础上依次加1
enum类型的变量只能取定义时的离散值
第一个默认为0
enum Color
{
GREEN,
RED = 2,
BLUE
};
printf("%d\n",GREEN);
printf("%d\n",&GREEN);// error
真正意义上的常量不可取地址,常量没有分配空间,不可改变。
#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量。
如图编辑器中的replace,简单字符串的替换。
#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量
-------------------------------------------------------------------------------------------
typedef分析
type rename
typedef用于给一个已经存在的数据类型重命名
typedef并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展
g++ test.c (c++) 对类型严格
gcc test.c
typedef和#define 区别
typedef是给已有类型取别名
#define为简单的字符串替换,无别名的概念
typedef char * PCHAR;
PCHAR p1,p2;
#define PCHAR char *
PCHAR p3,p4;
-------------------------------------------------------------------------------------------
遭人遗弃的goto
高手潜规则:禁用goto
项目经验:程序质量与goto的出现次数成反比
最后的判决:将goto打入冷宫
goto副作用分析
#include <stdio.h>
void func(int n)
{
int* p = NULL;
if( n < 0 )
{
goto STATUS;
}
p = malloc(sizeof(int) * n);
STATUS:
p[0] = n;
}
int main()
{
f(1);
f(-1);
return 0;
}
-------------------------------------------------------------------------------------------
void的意义
void修饰函数返回值和参数
--如果函数没有返回值,那么应该将其声明为void
--如果函数没有参数,应该声明其参数为void
void修饰函数返回值和参数仅为了表示无。
不存在void变量
--C语言没有定义void究竟是多大内存的别名。
没有void的标尺无法在内存中裁剪出void对应的变量。
void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void* 指针作为左值用于接收任意类型的指针
void* 指针作为右值赋值给其它指针时需要强制类型转换
int *pI = (int *)malloc(sizeof(int));
char *pC = (char *)malloc(sizeof(char));
void *p = NULL;
int *pni = NULL;
char *pnc = NULL;
p = pI; //ok
pni = p; //oops!
p = pC; //ok
pnc = p; //oops!
-------------------------------------------------------------------------------------------
extern中隐藏的意义
extern用于声明外部定义的变量和函数
extern用于告诉编译器用C方式编译
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,
通过extern关键字可以命令编译器“以标准C方式进行编译”。
extern "C"
{
int f(int a,int b)
{
return a+b;
}
}
-------------------------------------------------------------------------------------------
为sizeof正名
sizeof是编译器的内置指示符,不是函数
sizeof用于计算相应实体所占的内存大小
sizeof的值在编译器就已经确定
我是sizeof,不是函数
-------------------------------------------------------------------------------------------
enum是一种自定义类型
真正的常量不等同于const 变量
enum默认常量在前一个值的基础上依次加1
enum类型的变量只能取定义时的离散值
第一个默认为0
enum Color
{
GREEN,
RED = 2,
BLUE
};
printf("%d\n",GREEN);
printf("%d\n",&GREEN);// error
真正意义上的常量不可取地址,常量没有分配空间,不可改变。
#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量。
如图编辑器中的replace,简单字符串的替换。
#define宏常量无法被调试,枚举常量可以
#define宏常量无类型信息,枚举常量是一种特定类型的常量
-------------------------------------------------------------------------------------------
typedef分析
type rename
typedef用于给一个已经存在的数据类型重命名
typedef并没有产生新的类型
typedef重定义的类型不能进行unsigned和signed扩展
g++ test.c (c++) 对类型严格
gcc test.c
typedef和#define 区别
typedef是给已有类型取别名
#define为简单的字符串替换,无别名的概念
typedef char * PCHAR;
PCHAR p1,p2;
#define PCHAR char *
PCHAR p3,p4;
-------------------------------------------------------------------------------------------
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储
- C语言中计算正弦的相关函数总结