预测以下C++程序的输出。
问题1
#include
using namespace std;
int main()
{
int a = b = c = 0;
cout << a << "*" << b << "*" << c;
return 0;
}
输出:
Compile time error!
解释:
声明时不能使用链式语句来初始化变量。因此,语句a = b = c = 0;是非法声明。但是,遵循以下合法语法,可以在C++或C中使用。
int a,b,c;
a = b = c = 0;
问题2
#include
using namespace std;
int main()
{
for ( ; ; ) cout << "blank";
return 0;
}
输出:
Infinite Loop!
解释:
由于for循环中缺少初始化,测试条件和递增/递减条件,因此执行将陷入无限循环中。
问题3
#include
using namespace std;
int main()
{
int i;
for (i=0; i<3; i++);
cout << "hello!" <
输出:
hello!3
解释:
出现Hello!3的结果是因为在执行for循环时,由于定义了for循环的行中存在分号(;),因此它没有任何任务要做。循环将执行3次,i的值将变为3,然后其余语句将执行。
问题4
#include
using namespace std;
int main()
{
int i;
i = 1 + (1,4,5,6,3);
cout << i;
return 0;
}
输出:
4
解释:
逗号(,)运算符是一个二进制运算符,它评估第一个操作数并丢弃结果,然后评估第二个操作数,然后返回second的值。在这里,逗号(,)运算符的联想性是从左到右,并且很容易理解表达式(1,4,5,6,3)的计算结果为3,然后将结果1 + 3分配给i。
问题5
#include
using namespace std;
int main()
{
int a = 0, b;
b = (a = 50) + 10;
cout << a << "$" << b;
return 0;
}
输出:
50$60
解释:
语句b =(a = 50)+ 10;使用嵌入式分配的概念。在此,将值50分配给变量a,并将结果50 + 10分配给b。
问题6
#include
using namespace std;
int main()
{
char a = 30, b = 40, c = 10;
char d = (a*b)/c;
cout << int(d);
return 0;
}
输出:
120
解释:
在C++也可以执行算术计算考虑字符的ASCII值如果算术运算是在char数据类型的变量进行。在这种情况下,答案是120,这是x的ASCII值。
问题7
#include
using namespace std;
int main(int x)
{
static int i = 5;
if (--i)
{
cout << i;
main(10);
}
return 0;
}
输出:
4321
解释:
C++中的任何非零数字都将被视为真值。在这段代码中,if语句倾向于减小i的值,但在if块内部,一次又一次调用main()函数。这里的程序似乎处于无限循环中,但变量i本质上是静态的,它具有直到执行的生命周期,因此如果i变为0,则程序将停止。
问题8
#include
using namespace std;
int main(int x)
{
int i = 5;
if (--i)
{
cout << i;
main(10);
}
return 0;
}
输出:
infinite loop
解释:
C++中的任何非零数字都将被视为真值。在这段代码中,if语句倾向于减小i的值,但是在if块内部,一次又一次调用main()函数(所有语句现在都像是一个新程序一样执行),因此该程序将执行由于没有终止条件,将陷入无限循环。