首页 > 代码库 > volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域



1.volatile:要求参数修改每次都从内存中的读取。这种情况要比普通运行的变量需要的时间长。

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

 

voidmain()

{

   time_tstart,end;

   doubleres = 0;

   time(&start); //获取时间,传递给start

   //volatile强制每次从内存读取

   volatileinti;

   for (i = 0; i < 3000000000;i++)

   {

       res +=i;

   }

   printf("\n%f",res);

   time(&end); //获取结束时间

   printf("\n volatile消耗时间%fs",difftime(end,start));

   system("pause");

}

 

voidmain1()

{

   time_tstart,end;

   doubleres = 0;

   //获取时间,传递给tart

   time(&start);

   inti;

   for (i = 0; i < 3000000000;i++)

   {

       res +=i;

   }

 

   printf("%f",res);

   //获取结束时间

   time(&end);

   printf("\n消耗时间%fs",difftime(end,start));

   system("pause");

}

当设置了成按照C99标准运行之后,使用volatile变量之后的程序运行的时间将比register的长。

因为volatile是强制程序中内存中读取数据,所以可以通过修改内存中的这个参数来不断改变传入到cpu里的这个值。

2.可变参数

#include<stdio.h>

#include<stdlib.h>

#include<stdarg.h>  //作用是预定义一些宏,让后把我们需要的参数拷贝过来

#include<memory.h>

 

intadd(intn, ...)//...代表多少个参数都可以,其中n表示可变参数的个数

{

   va_listv;    //保存可以变长的参数列表

   va_start(v,n);//保存n之后的所有参数

   for (inti = 0;i <n;i++)

   {

       //按照int取出一个参数

       intdata =va_arg(v,int);

       printf("\n%d",data);

   }

   //释放列表

   va_end(v);

 

   return 0;

}

 

voidmain()

{

   //第一个表示的是可变参数的数量,一定要明确写出多少个

   add(5,1,2,4,5,6);

   system("pause");

}

再如,字符串类型的可变参数

#include<stdio.h>

#include<stdlib.h>

#include<stdarg.h>  //作用是预定义一些宏,让后把我们需要的参数拷贝过来

#include<memory.h>

 

/*当没有指定可变参数的数量的时候可以会出现执行不完的情况*/

//这里的第一个参数不是可变参数的个数,后面的n才是

voidrun(intnum,intn, ...)

{

   va_listv;     //保存可以变长的参数列表

   va_start(v,n); //n的之后所有参数保存之

   inti;

   for (i = 0; i <n;i++)

   {

       char *p = va_arg(v,char *);

       system(p);

   }

   va_end(v);//释放列表

}

 

voidmain()

{

   run(1, 3,"calc","notepad","tasklist");

   system("pause");

}

当程序运行之后,会出现计算器,笔记本,打印出已经开启的线程。

3.void *memset(void *s,int ch,size_t n);

A:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快的方法。

        B:需要的头文件

<memory.h>or <string.h> memset

<wchar.h>wmemset

关于strcpy()函数

memset

4.内联函数

5.宽字符,窄字符,国际化

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include<locale.h>  //本地化

 

voidmain()

{

   //指定窄字符

   MessageBoxA(0,"A我的","A我的",0);

   //指定宽字符(通过加L的方式)

   MessageBoxW(0,L"W我的",L"我的",0);

   MessageBox(0,L"OK",L"喔喔速度",0);

   //下面的方式兼容宽字符和窄字符

   MessageBox(0,TEXT("OK1"),TEXT("我阿达"),0);

   system("pause");

}

国际化

 

6.include

#undef限定作用域

去掉#undef后:

7.条件编译(#if #else #endif,这种只是处理两种

8.#if #elif #endif的使用

9.通过#define MM作为一个开关,控制开启或者关闭某段程序

 

10. #ifndef,#endif

11. define#号的作用

12.define##号的作用

13.define中多条语句拼接

#include<Windows.h>

#include<stdio.h>

 

//通过‘\‘来拼接两条语句

#defineRun(M)system(M); \

   printf("%s", M);   //这句可以打印名称。

voidmain()

{

   Run("calc");

   system("pause");

}

 

14.优先级

#include<stdio.h>

 

voidmain()

{

   inta[5] = { 1, 2, 3, 4, 5 };

   int *p = a;

   //printf("%d\n",*p++); //++的优先级大于 * 单独执行的结果是1

   //printf("%d\n",*(p++));//单独执行的时候结果为1

   //printf("%d\n",*++p); //单独执行的时候结果为2

   printf("%d",++*p);     //优先级必须要有接触,单独执行的时候结果为2

 

   getchar();

}

15.打印long long处理非常大的数据使用(lld):

long long data = http://www.mamicode.com/11234567890;//sizeof(longlong)

printf("%lld", data);//打印longlong处理非常大的数据

 

下面输出的时候的执行顺序是从右向左执行。

 

16.关于文件缓冲

//#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

#include<locale.h>//本地化

 

voidmain()

{

   printf("\n%c", *(stdin->_ptr));//取出缓冲区内容

   printf("\n%d",stdin->_cnt);//缓冲区还有多少个字符

   printf("\n");

   char ch =getchar();

   printf("\n");

   printf("\n%c", *(stdin->_ptr));//取出缓冲区内容

   printf("\n%d",stdin->_cnt);//缓冲区还有多少个字符

   ch =getchar();

   printf("\n");

   printf("\n%c", *(stdin->_ptr));//取出缓冲区内容

   printf("\n%d",stdin->_cnt);//缓冲区还有多少个字符

   printf("\n");

   putchar(ch);

   //stdout stdin不需要刷新,会及时更新,非缓冲

   //file fflush,刷新缓冲区

   system("pause");

 

   //char str[100] = "12345";sizeof(str)=100.strlen(str)=5

 

   getchar();

}

 

17.位域(通过这种方式有时候可以用于节约内存)