您的位置:首页 > 其它

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

2014-08-05 21:47 609 查看


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

#include
<stdio.h>

#include
<stdlib.h>

#include
<time.h>

 

void
main()

{

   
time_t
start,
end;

   
double
res = 0;

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

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

   
volatile
int
i;

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

   
{

       
res +=
i;

   
}

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

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

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

   
system("pause");

}

 

void
main1()

{

   
time_t
start,
end;

   
double
res = 0;

   
//获取时间,传递给tart

   
time(&start);

   
int
i;

   
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>

 

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

{

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

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

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

   
{

       
//按照int取出一个参数

       
int
data =
va_arg(v,int);

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

   
}

   
//释放列表

   
va_end(v);

 

   
return 0;

}

 

void
main()

{

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

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

   
system("pause");

}



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

#include
<stdio.h>

#include
<stdlib.h>

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

#include
<memory.h>

 

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

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

void
run(int
num,
int
n, ...)

{

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

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

   
int
i;

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

   
{

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

       
system(p);

   
}

   
va_end(v);//释放列表

}

 

void
main()

{

   
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>  
//本地化

 

void
main()

{

   
//指定窄字符

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

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

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

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

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

   
MessageBox(0,TEXT("OK我1"),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>

 

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

#define
Run(M)
system(M); \

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

void
main()

{

   
Run("calc");

   
system("pause");

}

 

14.优先级

#include
<stdio.h>

 

void
main()

{

   
int
a[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 = 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>//本地化

 

void
main()

{

   
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.位域(通过这种方式有时候可以用于节约内存)

 


 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐