auto 作为一个新的类型指示符来指示编译器,auto 声明的变量必须由编译器在编译时期推导而得。
#include
using namespace std;
int main()
{
int a = 0;
auto b = a;
auto c = &a;
auto* d = &a;
auto& e = a;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(e).name() << endl;
return 0;
}
PS:
int main()
{
int a = 0;
auto c = &a;
auto* d = &a;
auto& e = a;
return 0;
}
int main()
{
auto a = 10, b = 2.2;// error C3538: 在声明符列表中,“auto”必须始终推导为同一类型
return 0;
}
int main()
{
auto a[4] = {1, 2, 3, 4};// error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
return 0;
}
void f(auto) // error C3533: 参数不能为包含“auto”的类型
{
// ...
}
int main()
{
f(0);
return 0;
}
#include
using namespace std;
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
for (auto e : array)
cout << e << " ";
return 0;
}
PS:
与普通for循环相同,可以使用continue结束本次循环,使用break结束整个循环。
void Func(int arr[]) // error:arr数组的范围不确定
{
for (auto e : arr)
cout << e << " ";
}
观察以下程序:
void f(int) { cout << "f(int)" << endl; } void f(int*) { cout << "f(int*)" << endl; } int main() { f(0); f(NULL); return 0; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
NULL
实际是个宏,在文件中,可以看到:
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif
- 1
- 2
- 3
- 4
- 5
- 6
- 7
在C++11中引入新关键词 nullptr 表示指针空值,使用时不需要包含头文件。
sizeof(nullptr) 与 sizeof((void)0)* 所占字节数相同,后续表示指针空值时最好使用 nullptr。