zoukankan      html  css  js  c++  java
  • c查漏补缺

    restrict

    要理解什么是restrict,首先要知道Pointer aliasing:指两个或以上的指针指向同一数据,例如:

    int i = 0;
    int *a = &i;
    int *b = &i;

    这样会有什么问题呢?

    如果编译器采用最安全的假设,即不理会两个指针会否指向同一个数据,那么通过指针读取数据是很直观的。然而,这种假设会令编译器无法优化,例如

    int foo(int *a,int *b)
    {
       *a = 5;
       *b = 6;
       return *a + *b;//不一定是11       
    }

    (对以下汇编代码表示不懂)

    foo:

       movl $5,(%rdi) #存储5到*a

       movl $6,(%rsi) #存储6到*b

       movl (%rdi),%eax #重新读取*a(因为有可能被上一行指令造成改变)

       addl $6,%eax #加上6

       ret

    如果我们确保两个指针不指向同一数据,就可以用restrict修饰指针类型:

    int rfoo(int *restrict a,int *restrict b)
    {
        *a = 5;
        *b = 6;
        return *a + *b;
    }

    编译器就可以根据这个信息,做出优化:

    rfoo:

          movl  $11,%eax #在编译期已计算出11

          movl  $5,(%rdi) #存储5至*a

          movl  $6,(%rsi) #存储6到*b

          ret

    但如果用了restrict去修饰两个指针,而它们在作用域又指向同一地址,那么是未定义行为

    三个相关的取字符串函数

    getch():从控制台读取一个字符,但不显示在屏幕上(头文件:conio.h)

    getche():从控制台读取一个字符并回显(头文件:conio.h)

    getchar():从标准输入流读取一个字符并回显,读到回车符时退出()(头文件:stdio.h)

    2016-05-17 17:49:34

    1.scanf

    char s[100]

    scanf("%s",s),scanf("%s",&s);

    ®对数组来说,s数组首元素的地址和&s都指向数组的首地址,故从地址值上来说是一样的;scanf接收一长串字符后,都按这个地址一一往后填字符,故s[100]对应的字符时相同的

    区别在于地址偏移:&s+1是数组首地址+sizeof(s),也即指向a[100]后面去了,而a+1指a[0]+1,也即a[1]的地址

    ®忽略空格和换行,即遇见空格或换行即停止接收

    2.getline(cin,str)//str:string类型,头文件string

    3.sscanf

    char buf[512] ;

    sscanf("123456 ", "%s", buf);//此处buf是数组名,表示将123456以%s的形式存入buf中!,可用puts输出

    sscanf("123456 ", "%4s", buf);//取最大长度为4字节的字符串放入buf中

    sscanf("123456abCdDedfBCsDEF", "%[1-9a-z]", buf);//123456ab,取仅包含1~9,a~z的字符,遇见既不为数字也不为小写字母即停止接收,本例等价于[^A-Z]

    sscanf("They/are520@fromChina102", "%*[^/]/%[^@]",buf);//获取/和@之间的字符串

    sscanf("hello, world", "%*s%s", buf);//world,注意逗号之后有空格,%s遇空格停止,*s则忽略第一个读到的字符串

    参照:http://www.cnblogs.com/zhourongqing/articles/2451757.html

     stray'241'in program:程序中出现了非法的标志符,一般是中文标识符,如空格(删除所有行首和行尾的空格,重新编译)

  • 相关阅读:
    this指向
    this指向
    this指向
    this指向
    a=b=c 连等赋值的分析
    测试应用documentFragment 和 直接操作dom 的区别
    javascript 基本数据类型、引用数据类型
    判断一个变量的具体类型 的终极方案
    判断变量是否为 NaN
    C#稳固基础:传统遍历与迭代器
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5432997.html
Copyright © 2011-2022 走看看