为啥这行得通?我无法理解这种交换的逻辑

Posted

技术标签:

【中文标题】为啥这行得通?我无法理解这种交换的逻辑【英文标题】:Why is this working? I cannot understand the logic of this swapping为什么这行得通?我无法理解这种交换的逻辑 【发布时间】:2020-05-02 18:02:22 【问题描述】:
int main() 
    // Complete the program
    string a,b;
    getline(cin,a);
    getline(cin,b);
    cout<<a.size()<<" ";
    cout<<b.size();
    string c=a+b;
    cout<<endl<<c;

    swap(a[0],b[0]);
    cout<<endl<<a<<" "<<b;
    return 0;

void swap(string s1,string s2)
    string temp=s1;
    s1=s2;
    s2=temp;

目标是交换两个字符串的第一个元素,但我为此创建了一个通用函数,甚至做对了。但是,出乎意料的是,我没有使用按引用传递或指针传递!即便如此,当我最终尝试输出 a 和 b 时,这些更改是永久性的!

从逻辑上讲,它不应该起作用,但它起作用了。和字符串有关吗?

【问题讨论】:

注意:std::swap 存在。 发布所有代码,包括标题包含,而不是 sn-ps。有一个 std::swap 函数,而且很可能是该函数被调用。 你能告诉我们你使用了哪个输入 a 和 b 吗?我同意,这不应该工作...... 你知道我有心灵感应吗?我碰巧知道您的代码开头有using namespace std;,即使您没有显示它。我应该去算命... a[0]b[0] 是单独的 char 引用。它不是调用你的函数来接受字符串。 【参考方案1】:

这几乎可以肯定是因为在你没有向我们展示的代码中的某个地方,你有这行(或非常相似的东西):

using namespace std;

加上这一行,那么namespace std 定义一个函数如下:

void swap(_Ty& _Left, _Ty& _Right);

在您的swap(a[0],b[0]); 调用中,_Ty 模板被替换为 char

你的 swap 函数中添加一个简单的cout &lt;&lt; "My Swap" &lt;&lt; endl; 行,你会发现它没有被调用。

强烈推荐阅读:Why is "using namespace std;" considered bad practice?。

【讨论】:

非常感谢我明白了!但即使我以自己的方式定义交换;正在使用命名空间的功能! 是的 - 编译器会为您的调用找到“最佳匹配”,这不是您提供的那个。将using namespace std; 替换为using std::cout; using std::cin; using std::endl; using std::string; 之类的行,然后编译器会给你一个函数调用错误的错误。 如果我删除命名空间std;它实际上应该起作用,因为最好的匹配将是我定义的函数;不是吗? @GaganrajdeepSingh 不,因为你的函数接受字符串,而你给它单个字符。 @GaganrajdeepSingh 没有从单个字符到std::string 的转换,尽管std::string 的一些重载运算符接受单个字符。

以上是关于为啥这行得通?我无法理解这种交换的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

为啥变量没有更新?任何逻辑

无法理解这段代码中settimeout的逻辑

为啥逻辑适用于函数但不使用类,合并排序算法

如何从 Azure 数据工厂安全地调用 Azure 逻辑应用

为啥这个版本的 C 中的逻辑 AND 没有显示短路行为?

C++ 多态性。为啥这行得通?