玩setw,cout和for

时间:2016-05-07 16:02:52

标签: c++

为什么这种不同的行为取决于它是否成为for语句,或者它是一个简单的cout << '*'重复三次还是cout << "***"

所有句子都有一个setw(6),就像钻石的第二行和第八行一样,但并非所有句子都具有相同的行为,如你所见。一些开始输出填充6个空格,其他统计输出填充4个空格。

#include <iostream>

using std::cout;

#include <iomanip>

using std::setw;

int main(){
    int ast = 1,
        pos = 5;

    for(int i = 1; i <= 9; i++) {
        cout << setw(pos);
        for(int j = 1; j <= ast; j++)
                cout << '*';
        if(i <= 4) {
            ast += 2;
            pos -= 1;
        }
        else {
            ast -= 2;
            pos += 1;
        }
        cout << '\n';
    }


    cout << '\n';

    cout << "cout << \"***\"\n";
    cout << setw(6);
    cout << "***";

    cout << '\n';

    cout << "for x3 cout << '*'\n";
    cout << setw(6);
    for(int i = 1; i <= 3; i++) // this should look like the first for statement, but not
        cout << '*';

    cout << '\n';
    cout << "cout << '*' three times\n";
    cout << setw(6);
    cout << '*';
    cout << '*';
    cout << '*';
    cout << '\n';

    return 0;
}

这是我为此代码获得的输出:

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

cout << "***"
   ***
for x3 cout << '*'
     ***
cout << '*' three times
     ***

另外,不是这样的:

 cout << setw(6);
    for(int i = 1; i <= 3; i++)
        cout << '*';

与此相同吗?

cout << setw(6);
cout << '*';
cout << '*';
cout << '*';

谢谢。

2 个答案:

答案 0 :(得分:2)

每次调用import types时,流的width都会自动重置(为零)。因此,如果您有一个循环写入多个值,则每次循环时都必须使用operator <<

http://en.cppreference.com/w/cpp/io/manip/setw

答案 1 :(得分:1)

对于以下内容:

cout << setw(6);
cout << "***";

***'吃'std::setw提供的6个空格中的3个。

但是:

 cout << setw(6);
 for(int i = 1; i <= 3; i++)
      cout << '*';

cout << setw(6);
cout << '*';
cout << '*';
cout << '*';

*仅'吃'其中一个空格。之后,当调用下一个width时,将重置流的cout <<

你不会想要任何不同的行为,因为保留width的替代方案在最后两个例子中会有* * *