请注意,此问题最初发布于2009年,在C++ 11批准之前以及
auto关键字的含义发生重大变化之前.提供的答案仅适用于C++ 03的含义auto- 即指定的存储类 - 而不是C++ 11的含义auto- 即自动类型推导.如果您正在寻找有关何时使用C++ 11的建议auto,则此问题与该问题无关.
在最长的时间里,我认为没有理由static在C中使用关键字,因为在块范围之外声明的变量是隐式全局的.然后我发现static在块范围内声明一个变量会给它一个永久的持续时间,并且在块范围之外(在程序范围内)声明它会给它文件范围(只能在该编译单元中访问).
所以这给我留下了一个我可能还没有完全理解的auto关键字:关键字.除了"局部变量"之外还有其他一些含义吗?无论你想在哪里使用它,它都没有隐含地为你做的事情?auto变量如何在程序范围内表现?static auto文件范围中的变量是什么?此关键字除完全性之外是否还有其他目的?
在阅读Herb Sutter撰写的关键词(或其他名称)时,我遇到了以下几点:
没错,有些关键字在语义上等同于空格,这是一个美化的评论.
和
我们已经看到为什么C++语言将关键字视为保留字,我们已经看到两个关键字-auto和register--它们对C++程序没有任何语义差异.不要使用它们; 无论如何,它们只是空格,并且有更快的方式来输入空格.
如果关键字auto(可能不是在C++ 11中)并且register没有价值,那么它们为什么被创建和使用?
如果包含register变量之前没有任何区别
#include<stdio.h>
int main(){
register int a = 15;
printf("%d\n%d\n",&a,a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么上述程序会出错?
test_register.c:在函数'main'中:
test_register.c:4:2:错误:请求的寄存器变量'a'的地址
的printf( "%d \n%d \n",&A,A);
以下程序适用于C++.
#include<iostream>
int main(){
register int a = 15;
std::cout<<&a<<'\n'<<a;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 能否请你在C程序中给出关键字"auto"的确切概念.
当我读完一本书"Deep C secrets"时,得到了以下引用.
auto关键字显然毫无用处.它只对在符号表中创建条目的编译器 - 写入器有意义 - 它表示此存储在进入块时自动分配(与全局静态分配或堆上的动态分配相反).Auto与其他程序员无关,因为默认情况下你会得到它.
存储类标识符auto的用例?我知道默认情况下所有局部变量都是auto.但是,通过明确写入auto int a会有什么不同?
我在C How to Program 7th一书中读到了一个关于一些新的标准 C 存储类的注释_Thread_local:
新的 C 标准增加了存储类说明符
_Thread_local,这超出了本书的范围。
我在谷歌和这里寻找它,但没有出现。有人可以给我一些关于它的链接吗?
我有以下结构:
typedef struct _foo_t {
int bar;
float buzz;
char quux[40];
} *const foo_t;
Run Code Online (Sandbox Code Playgroud)
有没有办法获得结构的大小,就像通过它完成sizeof(struct _foo_t),但只使用名称foo_t?我试过了sizeof(*foo_t),但那不编译.
C是否保证结构中的无符号整数字段被初始化为零?在我的系统中,似乎它(或者我非常"幸运"(实际上是不幸的)).
在代码中,在以下场景中会发生什么?
struct node {
unsigned int rec_size;
};
struct node node;
// what is the value of node.rec_size? Undefined or 0?
Run Code Online (Sandbox Code Playgroud)
相关的答案,但不一样,因为在我的例子中,只有一个字段,没有初始化.
阅读本文后:在C++中使用auto声明变量是否存在缺点?
我问自己:真的没有一个回答者知道auto不是一个类型而是存储类说明符.
或者,auto因为C++ 11与普通C中的存储类说明符不同?
如果是这样,这会破坏C和C++之间的兼容性吗?
(我知道他们的官方从来没有相互支持过,但我的经验是C ++委员会试图尽可能接近C,但是现在可以改变现有的关键字而不是过时的.只是添加一个新的.为什么在这里做这样的突破consistens?)
通常在C中,我们将语句作为列表,当程序运行时,它逐个执行语句.是否可以同时执行两个语句?
例如,假设我希望交换两个变量a和b.通常我们会声明第三个变量c.
c=b;
b=a;
a=b;
Run Code Online (Sandbox Code Playgroud)
但是如果我们能够同时执行两个语句,那么我们就不需要第三个变量c.我们可以做a=b;,并b=a;同时代替.
那么,有没有办法同时执行两个或多个语句?