c语言:关键字(一):auto和register


在这里插入图片描述

一.古老的关键字—auto

1.全局变量与局部变量

在这里插入图片描述

在花括号里定义的变量就是局部变量,反之就是全局变量

这里举个例子
在这里插入图片描述
这时我们在进行编译时会报错告诉我们y没定义
在这里插入图片描述
这其实就是因为局部变量只能在它所定义的那个花括号使用,一旦出了花括号,这个变量就会被销毁

2.auto的使用

在这里插入图片描述

说明一下上面的解释有些不准确,并非所有变量都是auto,只有局部变量才会看为auto

auto是一个比较古老的关键词,用来修饰局部变量,它的存在就是说明该变量只在这个花括号内使用。其实对于我们来说,已经很少见到这个关键词了,因为我们会默认局部变量前面有auto,通常不写出来

在这里插入图片描述

但为什么是修饰局部变量的呢,看下面的例子

在这里插入图片描述

在这里插入图片描述

对于auto的结论

很老,基本永不使用,当然这是在c语言中,如果在c++中auto的使用会不同,这里就不详细说啦

二.最快的关键字—register

这里来谈一谈储存器,常见的储存器像寄存器,cache,内存,硬盘…这些储存器离cpu越远其储存内容越大但效率越低

在这里插入图片描述

rejister的作用就是尽量将所修饰的变量放入CPU寄存器中,从而达到提高效率的目的

当然,并非所有变量都能使用register来“加速”

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

%95以上的概率不会使用,早期人们需要手动优化程序,但现在编译器已经很智能了,不再需要手动优化。所以,该关键字不用管

在这里插入图片描述

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
非常好的问题!以下是一个简单的 C 代码,可以统计关键字的数量: ```c #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXWORD 100 #define NKEYS (sizeof keytab / sizeof(struct key)) struct key { char *word; int count; } keytab[] = { {"auto", 0}, {"break", 0}, {"case", 0}, {"char", 0}, {"const", 0}, {"continue", 0}, {"default", 0}, {"do", 0}, {"double", 0}, {"else", 0}, {"enum", 0}, {"extern", 0}, {"float", 0}, {"for", 0}, {"goto", 0}, {"if", 0}, {"int", 0}, {"long", 0}, {"register", 0}, {"return", 0}, {"short", 0}, {"signed", 0}, {"sizeof", 0}, {"static", 0}, {"struct", 0}, {"switch", 0}, {"typedef", 0}, {"union", 0}, {"unsigned", 0}, {"void", 0}, {"volatile", 0}, {"while", 0} }; int getword(char *, int); int binsearch(char *, struct key *, int); int main() { int n; char word[MAXWORD]; while (getword(word, MAXWORD) != EOF) { if (isalpha(word[0])) { if ((n = binsearch(word, keytab, NKEYS)) >= 0) { keytab[n].count++; } } } for (n = 0; n < NKEYS; n++) { if (keytab[n].count > 0) { printf("%4d %s\n", keytab[n].count, keytab[n].word); } } return 0; } int getword(char *word, int lim) { int c, getch(void); void ungetch(int); char *w = word; while (isspace(c = getch())) { ; } if (c != EOF) { *w++ = c; } if (!isalpha(c)) { *w = '\0'; return c; } for (; --lim > 0; w++) { if (!isalnum(*w = getch())) { ungetch(*w); break; } } *w = '\0'; return word[0]; } int binsearch(char *word, struct key tab[], int n) { int cond; int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (low + high) / 2; if ((cond = strcmp(word, tab[mid].word)) < 0) { high = mid - 1; } else if (cond > 0) { low = mid + 1; } else { return mid; } } return -1; } int bufp = 0; char buf[MAXWORD]; int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= MAXWORD) { printf("ungetch: too many characters\n"); } else { buf[bufp++] = c; } } ``` 这个程序使用了一个结构体数组 `keytab` 来存储关键字和它们出现的次数。`getword` 函数用来获取输入中的单词,并将其转换为小写形式。`binsearch` 函数用来在 `keytab` 数组中查找单词。最后,程序会输出每个关键字出现的次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸蛋挞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值