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:程序中出现了非法的标志符,一般是中文标识符,如空格(删除所有行首和行尾的空格,重新编译)

posted @ 2016-04-25 22:19  我在这儿  阅读(255)  评论(0编辑  收藏  举报