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");
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/88308e83b1bf811e9c9d9246538f2a41)
再如,字符串类型的可变参数
#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()函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/bc30c9318d7eb3e78aeac6f731ad5f19)
memset
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/4e3ab910e6dbf9251c62b5350de12e61)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/f1ec53df7a57a60bc23255e9a7c5d6ce)
4.内联函数
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/7ea7fa96687a681f9d3d751d9d551309)
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");
}
国际化
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/135d74665cf5bbf210f56f985aa319b2)
6.include
#undef限定作用域
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/28277488869c6ea09b894f4dab343189)
去掉#undef后:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/851b730af55316a7bfc9cda2a5aa13ab)
7.条件编译(#if #else #endif),这种只是处理两种
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/0af7c6491a255e34215cc026f781bf80)
8.#if #elif #endif的使用
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/b7b5ff9142dd3027bf00ae0e32b84fa6)
9.通过#define MM作为一个开关,控制开启或者关闭某段程序
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/9004322cd738ecf3944f336effc78087)
10. #ifndef,#endif
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/9b0bf80ce3c45ccb23de57b4309efcd6)
11. define中#号的作用
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/74b385f3d7f30378c31688fdfcd4ad1f)
12.define中##号的作用
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/ec16b4dacd8bfdadf0e863c604a735d5)
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
处理非常大的数据
下面输出的时候的执行顺序是从右向左执行。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/9a19986ed987a2e7c5fee63473ceffef)
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.位域(通过这种方式有时候可以用于节约内存)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/12/9e80219fc3adc96e33d4140d1758a77a)
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.位域(通过这种方式有时候可以用于节约内存)
相关文章推荐
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- C语言学习11:typedef和define区别,头文件的使用以及 <>和“”区别,宏定义中#和##的用法,条件编译,gcc和c99中宏定义使用printf和sprintf,条件编译避免头文件包含
- 预处理命令(宏定义,条件编译,头文件)
- 参数的传递方式、变量的作用域、变量的生存期、内部函数和外部函数、编译预处理命令、条件编译
- vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- C语言预处理命令之条件编译(#ifdef,#else,#error,#endif,#if...)
- C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- [编译预处理系列1]用#ifndef/#define#endif来防止头文件被引用(例子)
- C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- C语言和c++预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- linux tr命令参数及用法详解---删除文件中控制字符或进行字符转换
- C语言预处理命令之条件编译
- vc++学习篇(三)——预处理命令之条件编译(#ifdef,#else,#endif,#if等)
- 鸡啄米:C++编程入门系列之二十四(C++程序设计必知:多文件结构和编译预处理命令)
- 预处理命令之条件编译
- 预处理命令-条件编译
- 多文件结构和编译预处理命令
- 预处理命令--条件编译
- C++编译预处理:宏定义指令、文件包含指令和条件编译指令