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

简介:  1.volatile:要求参数修改每次都从内存中的读取。这种情况要比普通运行的变量需要的时间长。 #include <stdio.h> #include <stdlib.h> #include <time.h>   void main() {     time_t start, end;


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("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>

 

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

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

 

 

 

 

 

 

目录
相关文章
电脑上扫码支付功能用法
  PC扫码支付的方式,支持前置模式和跳转模式。  前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体分为以下几种:  0:订单码-简约前置模式,对应 iframe 宽度不能小于600px,高度不能小于300px; qr_pay...
3297 12
|
12月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
Kubernetes 数据库 Docker
Kubernetes Node删除镜像
【7月更文挑战第1天】
305 8
|
12月前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
343 3
|
弹性计算
阿里云10M带宽收费价格表
阿里云10M带宽收费价格表,阿里云服务器上海地域10M带宽一年优惠价格5355元,10M带宽一个月525元,地域不同带宽价格不同,阿里云服务器网以华东1(上海)地域为例,5M及5M以下带宽按照23元一个月的价格收取,6M及6M以上公网带宽按照80元一个月的价格收取。阿里云百科使用阿里云价格计算器,计算一下阿里云10M公网带宽一个月价格和一年价格
360 0
|
弹性计算 Ubuntu Cloud Native
阿里云服务器操作系统选哪个比较好?
阿里云服务器操作系统如何选择?Windows还是Linux?Windows选哪个版本?Linux选哪个版本?
3915 0
阿里云服务器操作系统选哪个比较好?
|
Java 数据库连接 数据库
springboot项目运行时报错:HikariPool-1 - Exception during pool initialization.
springboot项目运行时报错:HikariPool-1 - Exception during pool initialization.
1325 0
|
机器学习/深度学习 SQL 数据采集
airflow使用指南-机器学习工程自动化
airflow使用指南-机器学习工程自动化
1531 0