Compiler: g++ (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0
在回顾一些C ++基础知识期间,我编写了一个简单的字符交换函数,该函数将两个字符指针作为参数,然后在它们的位置交换值。
如果传递了指向数组索引的指针或引用,则交换函数中有一个cout
语句,将相应地址处的值按预期输出到控制台。
但是,我遇到了一个“错误”,如果我尝试传递两个数组元素而不是元素的地址,该函数将按预期执行交换,但是控制台没有输出。
我本来希望对数组值进行解引用会导致seg-fault,但相反,编译器似乎知道了什么意思并按预期执行了交换。
最初,我认为可能没有刷新IO缓冲区,但是对cout.flush()
的调用或输出std::endl
的调用没有影响。
为什么这在运行时不会引起错误,为什么cout
输出被抑制?
// swap.cpp
#include <iostream>
using namespace std; // Yes - you should not do this.
void swap(char* a, char* b) {
cout << "Swapping: " << *a << ", " << *b << endl;
char tmp = *a;
*a = *b;
*b = tmp;
}
int main(int argc, char* argv[]) {
char str[] = "abc";
cout << "Original: " << str << endl;
swap(&str[0], &str[2]);
cout << "Result A: " << str << endl;
swap(str[0], str[2]); // no cout output from inside swap function
cout << "Result B: " << str << endl;
return 0;
}
输出:
Original: abc
Swapping: a, c
Result A: cba
Result B: abc