【问题标题】:C++ string cout character lostC++ 字符串 cout 字符丢失
【发布时间】:2016-10-28 03:31:52
【问题描述】:

这是 Visual Studio 中的一个控制台应用程序,所以我想看看如果我在 cout 中调用 cout 会发生什么。它有点工作,但它删除了一个有点奇怪的角色。因此,它从cout 中的string 中删除了main 中的字符数量。因此,它将尽可能多的字符删除到 doPrint() 函数的返回值。

示例: 如果返回值为 1,它将输出“AAAABLLLLLLLLLL” 如果返回值为 2,它将输出“AAAAALLLLLLLLLL”

#include "stdafx.h"
#include <iostream>

int doPrint()
{
    std::cout << "AAAAA" << std::endl;
    return 1;
}

int main()
{
    std::cout << "BBLLLLLLLLLL" + doPrint() << std::endl;
    int x;
    std::cin >> x;
    return 0;
}

这没什么大不了的,但我想知道为什么会这样。 已经谢谢了。

P.S:我知道我应该使用&lt;&lt; 而不是+

【问题讨论】:

  • "BBLLLLLLLLLL" + doPrint() 当然不会像您认为的那样做。阅读指针算法。
  • 这个可以简化为int main() { std::cout &lt;&lt; "ABC\n" + 1; }

标签: c++ std iostream


【解决方案1】:

嗯,基本上发生的是指针算术和函数调用的指定评估顺序。

"BBLLLLLLLLLL" + doPrint()

所以

"BBLLLLLLLLLL" + 1 

产量

BLLLLLLLLLL

"BBLLLLLLLLLL" + 2 

产量

LLLLLLLLLL

std::cout.

它将函数指针算法与字符数组字面量一起应用,并且 "loose" 个字符,因为doPrint() 产生的结果大于0

+ 的运算符优先级高于&lt;&lt;,因此首先调用doPrint() 并打印AAAAA。所以你的立场

 std::cout << "BBLLLLLLLLLL" + doPrint() << std::endl;

分解为

  1. 致电doPrint()
    1.1。拨打std::cout &lt;&lt; "AAAAA" &lt;&lt; std::endl;
  2. doPrint()的结果值调用"BBLLLLLLLLLL" + 1
  3. 致电std::ostream&amp; operator&lt;&lt;(std::otream&amp;, const char*)
  4. 致电std::endl

【讨论】:

  • @user4568696 好吧,要真正让它成为一个不错的答案,此时还需要另外 10 个支持:-P ...
  • @Boopy 别担心,我只是在开玩笑说nice answer badge,我已经获得了足够的奖励 ;-)。找到接受按钮至少对您来说已经足够好。
猜你喜欢
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多