预测以下 C++ 程序的输出。
- 方案一
#include
using namespace std; int main() { char array[3] = "abc"; cout << array; return 0; } 输出:
error: initializer - string for array of chars is too long
说明:数组在C++中的应用与C中类似,唯一的例外是字符数组的初始化方式。在 ANSI C 中初始化字符数组时,编译器将允许以下声明——
char array[3] = "abc" // allowed in ANSI C
这是因为 C 假定程序员打算在定义中省略 NULL (‘\0’)字符。但是在 C++ 中,大小应该比字符数大 1,因此以下语句是正确的。
char array[4] = "abc" // O.K. for C++
- 方案二
#include
using namespace std; int main() { cout << sizeof('x'); cout << sizeof(char); return 0; } 输出:
1 1
说明:值得注意的是,字符常量在 C++ 中被存储为字符类型,但在 C 中并非如此。在 ANSI C 中,相同的程序会产生结果——
4 1 // result when code is executed in C
因为字符常量被提升为 int。
建议您在 C 中执行相同的代码 - 方案三
#include
using namespace std; int main() { void *ptr1; char *ptr2; ptr2 = ptr1; // statement 1 return 0; } 输出:
error: invalid conversion from 'void*' to 'char*
说明:在 C 或 C++ 中允许将任何指针类型分配给空指针而不使用强制转换。但是我们不能在 C++ 中不使用转换为非空指针类型的情况下将空指针分配给非空指针。因此,陈述一应该是——
ptr2 = (char*)ptr1; // valid in C++
注意——应该注意的是,当相同的代码在 C 中编译时,它不会产生任何错误,即在 C 中我们可以将一个空指针分配给一个非空指针,而无需使用任何类型转换。
- 程序 4
#include
using namespace std; int main() { const int size; cout << size; return 0; } 输出:
error: uninitialized const 'size'
解释:乍一看很明显会认为输出将是一些垃圾值,但事实并非如此。与 C++ 中的 C 不同,任何声明为常量的变量都需要在声明时进行初始化。因此给定的代码不会编译并抛出错误。应该注意的是,相同的代码将在 ANSI C 中编译,并将产生 0 的输出。
- 计划5
#include
using namespace std; int main() { enum season { spring, summer, autumn, winter }; season myFavSeason_1 = spring; season myFavSeason_2 = 4; // statement 1 cout << myFavSeason_1; cout << endl; cout << myFavSeason_2; return 0; } 输出:
error: invalid conversion from 'int' to 'main()::season' season myFavSeason_2 = 4;
说明:与 C++ 中的 C 不同,每个枚举数据类型都保留其自己单独的类型。这意味着 C++ 不允许将 int 值自动转换为 enum 值。所以在执行代码时会出错。但是,如果类型转换完成,代码将工作,将语句 1 更改为以下语句 –
season myFavSeason_2 = (season) 4;