首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-02 
C++基础再问1,用cout输出字符 \v (竖向跳格)显示的是一个奇怪的字符,并没有竖向跳格,是怎么回事?用cout输

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;
这样你才能使用这些标准的头文件里面的内容。

热点排行