读书人

C++基础再问,该如何解决

发布时间: 2012-03-02 14:40:28 作者: rapoo

C++基础再问
1,用cout输出字符 '\v '(竖向跳格)显示的是一个奇怪的字符,并没有竖向跳格,是怎么回事?
用cout输出字符 '\b '(退格)是不是当退到一行的最前面时,不管前面还有多少行,都不会再退?
字符 '\n '(换行)包含了回车和换行的功能,即下一次操作在下一行的开始;而 '\r '(回车)只是回车,回到当前行最前面;是这样吗?
是不是说 '\n '是先换行再执行 '\r '?

2,
#include <iostream.h>
#include <iomanip.h>

void main()
{
cout < <setiosflags(ios::left)
< <setw(5) < <1 < <endl
< <setw(5) < <1 < <endl
< <setw(5) < <1 < <endl;
cout < <setiosflags(ios::right)
< <setw(5) < <1 < <endl
< <setw(5) < <1 < <endl
< <setw(5) < <1 < <endl;
}
为什么显示结果中6个1全部左对齐?

3,为什么
const double e = 2.718281828;
cout < <setiosflags(ios::fixed) < <setprecision(8) < <e < <endl;
cout < <setiosflags(ios::scientific) < <setprecision(8) < <e < <endl;
显示结果为:
2.71828183
2.7182818
删掉第二条语句后:
const double e = 2.718281828;
cout < <setiosflags(ios::scientific) < <setprecision(8) < <e < <endl;
显示结果才为:2.71828183e+000

4,在VC下运行下面的程序:
#include <iostream.h>

float & fn(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}

void main()
{
float & d = fn(5.0);
cout < <d < <endl; //output 78.5
cout < <d < <endl; //output 5.88366e-039
}
为什么对局部对象的引用,第一次还能输出正确结果?而第二次和第一次的值为什么又不同呢?我本来以为的是,
第一次就不能得到正确结果,因为局部变量不存在了.第二次更不用说了.


5,在VC下运行下面的程序:
#include <iostream.h>

float & fn(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}

void main()
{
fn(5.0) = 12.4;
cout < <fn(5.0) < <endl; //output 78.5
}
对局部对象的引用还可以作左值?对局部对象的引用始终保持局部变量的值78.5???局部对象不是不存在了吗???

[解决办法]
楼主确信 第五题能这样写?

我认为这么写是错误的,之所以能维持这个值,只是因为那块内存没被改写而已



[解决办法]
问题1,这个没啥可讨论的,试下啥结果就啥结果。不过,不同的操作系统,试下来的结果可能会不同。
[解决办法]
第五题 如果要想检测值是否被更改,应该这么写

#include <iostream.h>

float & fn(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}

void main()
{
float* pFloat = &(fn(5.0));
cout < < "未更改前: " < <*pFloat < <endl;
*pFloat = 12.4;

cout < < "更改后 " < <*pFloat < <endl; //output 78.5
}

[解决办法]
第1题 键盘是从打字机发展过来的,早期在DOS下显示那些控制字符时,也的确模拟成与打字机 类似的效果,但是随着视窗系统的发展,我们只能用模拟的DOS窗口,对它的字符输出控制能力也就越来越少,用TC2.0可以得你期望中的效果,并且关于“不回车换行”得用 putch( '\n ');

第2题 在 Dev-C++ 下调试结果和你预期的效果一致,在你的系统下我建议改写一下头文件引用
#include <iomanip>
#include <iostream>
using namespace std;

第3题 你同时设置了按定点小数和科学计数两种形式,产生冲突后使用默认输出形式。改写如下:
const double e = 2.718281828;
cout < <setiosflags(ios::fixed) < <setprecision(8) < <e < <endl;
cout < <resetiosflags(ios::fixed);
cout < <setiosflags(ios::scientific) < <setprecision(8) < <e < <endl;

第4题 首先你应该知道操纵符 endl 是一个全局函数; cout < <endl; 等价于 endl(cout);
float & d = fn(5.0); //d引用的函数内局部变量在没有新的栈操作时一般不会被改写,比如:
void main()
{
float & d = fn(5.0);
cout < <d < < ", "; //output 78.5
cout < <d < <endl; //output 5.88366e-039
}

第5题 引用的是变量,当然可以做左值。第一次调用 fn(5.0) 后 temp 的确被你改写了,
但你在第二次调用 fn(5.0) 的过程中,temp 在函数内部又被改写成原来的值了!
[解决办法]
用g++编译第五,好像根本就编译不过来啊;看来楼主的编译器没有严格遵守C++标准
[解决办法]
lz, 你的第 5 题里 fn(5.0) = 12.4; 在我机器上报错
提示:错误2error C2106: '= ' : left operand must be l-value
fn(5.0)返回值不是左值哦 我的是vs2005
[解决办法]
老式的.h头文件和新式的头文件差别在于:
老式的头文件内容里所有的函数和定义都是在全局定义的,而且,不保证他们符合最新的(相对最新,看编译器什么时候做的了)标准。
新式的头文件把所有内容都定义在命名空间 std 里,当你要使用这里面的内容时,应该使用下面的语句:
using namespace std;
这样你才能使用这些标准的头文件里面的内容。

读书人网 >C++

热点推荐