• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
merize
博客园    首页    新随笔    联系   管理    订阅  订阅

C入门之一

1.stdio.h不要写错成studio.h

2.

1 #include <stdio.h>
2 
3 int main()
4 {
5 /* 我的第一个 C 程序 */
6 printf("Hello, World! \n");
7 
8 return 0;
9 }

 

printf字符串必须用双引号,不然就报错hello.c:5:9: warning: character constant too long for its type

3.在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
http://blog.csdn.net/gao1440156051/article/details/48035911

4.define和const的区别
http://blog.sina.com.cn/s/blog_79b01f6601018xdg.html

1 #define 宏名称 宏值
2 
3 const 数据类型 常量名 = 常量值;

 

(1) 编译器处理方式不同
  define宏是在预处理阶段展开。
  const常量是编译运行阶段使用。
(2) 类型和安全检查不同
  define宏没有类型,不做任何类型检查,仅仅是展开。
  const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
  const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)const 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

5.c程序中可用的存储类
-> auto
-> register
-> static
-> extern

static的示例:

 1 #include <stdio.h>
 2 
 3 /*函数声明*/
 4 void func(void);
 5 static int count = 5;
 6 
 7 main(){
 8 while(count--){
 9 func();
10 }
11 return 0;
12 }
13 
14 void func(void){
15 static int i = 5;/*局部静态变量*/
16 i++;
17 printf("i is %d and count is %d\n", i, count);
18 }

 


extern示例:

 1 //extern_main.c内容
 2 #include <stdio.h>
 3 
 4 int count;
 5 extern void write_extern();
 6 
 7 main(){
 8 count=5;
 9 write_extern();
10 }
11 
12 
13 //extern_support.c内容
14 #include <stdio.h>
15 
16 extern int count;
17 
18 void write_extern(void){
19 printf("count is %d\n", count);
20 }
21 
22 //执行
23 [root@localhost test]# gcc extern_main.c extern_support.c
24 [root@localhost test]# ./a.out
25 count is 5

 

6.运算符自增自减

 1 #include <stdio.h>
 2 int main()
 3 {
 4 int c;
 5 int a = 10;
 6 c = a++;
 7 printf("先赋值后运算:\n");
 8 printf("Line 1 - c 的值是 %d\n", c );
 9 printf("Line 2 - a 的值是 %d\n", a );
10 a = 10;
11 c = a--;
12 printf("Line 3 - c 的值是 %d\n", c );
13 printf("Line 4 - a 的值是 %d\n", a );
14 printf("先运算后赋值:\n");
15 a = 10;
16 c = ++a;
17 printf("Line 5 - c 的值是 %d\n", c );
18 printf("Line 6 - a 的值是 %d\n", a );
19 a = 10;
20 c = --a;
21 printf("Line 7 - c 的值是 %d\n", c );
22 printf("Line 8 - a 的值是 %d\n", a );
23 }
24 
25 /*
26 先赋值后运算:
27 Line 1 - c 的值是 10
28 Line 2 - a 的值是 11
29 Line 3 - c 的值是 10
30 Line 4 - a 的值是 9
31 先运算后赋值:
32 Line 5 - c 的值是 11
33 Line 6 - a 的值是 11
34 Line 7 - c 的值是 9
35 Line 8 - a 的值是 9
36 */

 

7.位异或运算:
a^=b等价于a = a^b,其中^是位异或运算,即将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0;否则为1。
比如,假设,a的值为二进制的1010,b的值为二进制的1100,那么a^b = 0110

8.c字符串

 1 #include <stdio.h>
 2 
 3 int main ()
 4 {
 5 char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};
 6 
 7 printf("Greeting message: %s\n", greeting );
 8 
 9 return 0;
10 }

 

这段代码运行报错error: empty character constant,原因是单引号要有个空格。empty character constant这个英文的意思就是提示空字符。

9.typedef vs #define
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 typedef struct Books
 5 {
 6 char title[50];
 7 char author[50];
 8 char subject[100];
 9 int book_id;
10 } Book;
11 
12 int main( )
13 {
14 Book book;
15 
16 strcpy( book.title, "C Programming");
17 book.book_id = 6495407;
18 
19 printf( "Book title : %s\n", book.title);
20 printf( "Book book_id : %d\n", book.book_id);
21 
22 return 0;
23 }

 


10.文件读写

1 FILE *fopen( const char * filename, const char * mode );
2 int fclose( FILE *fp );
3 int fputc( int c, FILE *fp );
4 int fputs( const char *s, FILE *fp );
5 int fprintf(FILE *fp,const char *format, ...)
6 int fgetc( FILE * fp )
7 char *fgets( char *buf, int n, FILE *fp )
8 int fscanf(FILE *fp, const char *format, ...) 

 

11.c预处理器

 1 指令    描述
 2 #define    定义宏
 3 #include    包含一个源代码文件
 4 #undef    取消已定义的宏
 5 #ifdef    如果宏已经定义,则返回真
 6 #ifndef    如果宏没有定义,则返回真
 7 #if    如果给定条件为真,则编译下面代码
 8 #else    #if 的替代方案
 9 #elif    如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
10 #endif    结束一个 #if……#else 条件编译块
11 #error    当遇到标准错误时,输出错误消息
12 #pragma    使用标准化方法,向编译器发布特殊的命令到编译器中

 

12.预定义宏

1 宏    描述
2 __DATE__    当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
3 __TIME__    当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
4 __FILE__    这会包含当前文件名,一个字符串常量。
5 __LINE__    这会包含当前行号,一个十进制常量。
6 __STDC__    当编译器以 ANSI 标准编译时,则定义为 1

 

13.预处理器运算符

 1 宏延续运算符(\):
 2 一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\).
 3 
 4 字符串常量化运算符(#):
 5 在宏定义中,当需要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符(#)。在宏中使用的该运算符有一个特定的参数或参数列表
 6 
 7 标记粘贴运算符(##):
 8 宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记
 9 
10 defined() 运算符:
11 预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。

 

14.参数化的宏

CPP 一个强大的功能是可以使用参数化的宏来模拟函数。例如,下面的代码是计算一个数的平方:

1 int square(int x) {
2 return x * x;
3 }

 

我们可以使用宏重写上面的代码,如下:

1 #define square(x) ((x) * (x))

 

posted @ 2017-06-25 19:50  sukii  阅读(369)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3