c语言之c语言基础知识
2013-03-13 11:09
190 查看
1,“\”引起的错误:
在我们现在的编译器中如果写下面这段程序
编译就会用字符的颜色来提示我们,这两行内容都被当做了注释的内容,但是如果在vim下编写程序,就不会出现代码颜色不一样的问题,导致程序出错,是什么原因呢,是因为"\"的问题,它在c++或者python语言中,代表的含义都是本行尚未结束,下一行仍和本行是一个整体,所以编译器会认为,两行都是注释,最终导致错误。
2, 想想这个表达式: y = x/*p 他的结果是什么呢? 有可能是x的值除以*p的值的结果赋给y,但是在实际编译中会出错,为什么? 因为编译器会把 /*当成注释的开始,之后的内容都是注释,但是要结束注释需要找到匹配的*/,但是没有找到,所以编译会出错。如果向改正程序的话,在/, * 之间加一个空格,或者给他们加一个(),就解决了。
3, #define PCHAR char*
PCHAR p1, p2;
typedef char* pchar;
pchar p3, p4;
那sizeof p1, p2, p3, p4都是什么呢,结果是4, 1, 4, 4,结果很奇怪吧,原因要追溯到编译器对#define的处理,是对#define定义的东西在预编译的时候进行替换,也就是说真正编译的时候是这个样子 char * p1, p2;这样该明白p2的值是1的原因了吧。
4,enum enum_value {
VALUE_ONE,
VALUE_TWO,
VALUE_THREE,
}enum_val;
测试一下sizeof enum_val的值,看是多少,你会发现是4,其实这个原因很简单,enum 定义的变量只是一个UINT类型,而它生命的VALUE_ONE,VALUE_TWO, 只是enum变量的取值范围而已,所以enum不是像struct那样是个结构体,它表示的只是一个集合。
5, #define,因为在预编译的时候就会做替换,所以他不会导致不必要的内存分配。同时宏看起来像一个函数,但不会招致函数调用不必要的开销。
在定义宏的时候,必须记住为所以得实参加上小括号,但即使加上了小括号,也会遭遇麻烦:
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
看看下面的调用:
int a = 5, b = 10
CALL_WITH_MAX(++a, b)
CALL_WITH_MAX(++a, b + 10) 把实参替换一下就可以看到,a的递增次数取决于它被拿来和谁比较。
6, int a[6], sizeof(a[6]) 为什么不会出错? 因为sizeof 是一个关键字,关键字求值是在编译的时候,虽然并不存在a[100]这个元素,但是这里并没有真正的去访问a[6], 而是仅仅根据数据元素的类型确定其值。 那么函数引用a[6]就会出错,是因为函数求值是在运行的时候。
在我们现在的编译器中如果写下面这段程序
int main() { // create file in c:\ ofstream outupt("test.txt"); }
编译就会用字符的颜色来提示我们,这两行内容都被当做了注释的内容,但是如果在vim下编写程序,就不会出现代码颜色不一样的问题,导致程序出错,是什么原因呢,是因为"\"的问题,它在c++或者python语言中,代表的含义都是本行尚未结束,下一行仍和本行是一个整体,所以编译器会认为,两行都是注释,最终导致错误。
2, 想想这个表达式: y = x/*p 他的结果是什么呢? 有可能是x的值除以*p的值的结果赋给y,但是在实际编译中会出错,为什么? 因为编译器会把 /*当成注释的开始,之后的内容都是注释,但是要结束注释需要找到匹配的*/,但是没有找到,所以编译会出错。如果向改正程序的话,在/, * 之间加一个空格,或者给他们加一个(),就解决了。
3, #define PCHAR char*
PCHAR p1, p2;
typedef char* pchar;
pchar p3, p4;
那sizeof p1, p2, p3, p4都是什么呢,结果是4, 1, 4, 4,结果很奇怪吧,原因要追溯到编译器对#define的处理,是对#define定义的东西在预编译的时候进行替换,也就是说真正编译的时候是这个样子 char * p1, p2;这样该明白p2的值是1的原因了吧。
4,enum enum_value {
VALUE_ONE,
VALUE_TWO,
VALUE_THREE,
}enum_val;
测试一下sizeof enum_val的值,看是多少,你会发现是4,其实这个原因很简单,enum 定义的变量只是一个UINT类型,而它生命的VALUE_ONE,VALUE_TWO, 只是enum变量的取值范围而已,所以enum不是像struct那样是个结构体,它表示的只是一个集合。
5, #define,因为在预编译的时候就会做替换,所以他不会导致不必要的内存分配。同时宏看起来像一个函数,但不会招致函数调用不必要的开销。
在定义宏的时候,必须记住为所以得实参加上小括号,但即使加上了小括号,也会遭遇麻烦:
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
看看下面的调用:
int a = 5, b = 10
CALL_WITH_MAX(++a, b)
CALL_WITH_MAX(++a, b + 10) 把实参替换一下就可以看到,a的递增次数取决于它被拿来和谁比较。
6, int a[6], sizeof(a[6]) 为什么不会出错? 因为sizeof 是一个关键字,关键字求值是在编译的时候,虽然并不存在a[100]这个元素,但是这里并没有真正的去访问a[6], 而是仅仅根据数据元素的类型确定其值。 那么函数引用a[6]就会出错,是因为函数求值是在运行的时候。
相关文章推荐
- 黑马程序员——IOS基础之C语言---C语言基础知识介绍
- 学ios需要了解的C语言基础知识-11-C语言精华总结
- C语言2011计算机二级c语言考点:c语言的基础知识
- C语言基础知识之(四):C语言中涉及的数字问题
- C语言为什么要加#include<stdio.h>(C语言基础结构知识)
- 【C语言】C语言基础知识1. tip01~10
- C语言基础:C语言指针(4) - 补充一点关于指针的小知识
- 编程语言系列(三)--java语言基础知识点总结
- 【C语言基础】1-2 C语言基础代码
- C语言基础知识
- C语言基础知识
- oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍
- Linux下C语言编程基础知识
- Linux下C语言编程基础知识
- 【C语言基础】1-5 C语言循环与二维数组
- 黑马程序员----------------------------------------------C语言易忘基础知识点一
- 黑马程序员--Objective-C语言基础知识--Foundation框架的常见用法
- c语言基础知识回顾3
- 黑马程序员————C语言基础 第13篇 字符串知识总结
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(7)-- 流程控制语句