今天在做C++作业的时候发现了关于cout的一些执行顺序的问题,下面是我的代码。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int myStrLen(char *p);
char * myStrCpy(char *dest, char *source);
char * myStrnCpy(char *dest, char *src, int n);
char * myStrCat(char *dest, char *src);
char * myStrnCat(char *dest, char *src, int n);
int myStrCmp(char *dest, char *src);
int main() {
char str1[18] = "I love you.";
char *str2 = "Ciri.";
char *str3 = "ler";
char *str4 = "le";
char *dest=new char[18];
cout << myStrLen(str1) << endl
<< myStrCpy(dest, str1) <<endl
<<myStrnCpy(dest,str1,7)<<endl;
/*<<myStrCat(str1,str2)<<endl
<<myStrnCat(str1,str2,2)<<endl
<<myStrCmp(str1,str2)<<endl;*/
return 0;
}
//计算字符串p的长度
int myStrLen(char *p) {
int cx=0;
char *i = p;
while (*i != '\0') {
cx++;
i++;
}
return cx;
}
//将source中的字符串复制到dest中
char * myStrCpy(char *dest, char *source) {
for (int i = 0; i < myStrLen(source)+1 ; i++) {
*(dest + i) = *(source + i);
}
return dest;
}
//将source中的前n个字符复制到dest中
char * myStrnCpy(char *dest, char *src, int n) {
int Len=myStrLen(src);
if (Len < n)
n = Len;
for (int i = 0; i < n; i++) {
*(dest + i) = *(src + i);
}
*(dest + n) = '\0';
return dest;
}
预期结果应该是:
11
I love you.
I love
但实际结果却是:
11
I love you.
I love you.
于是我在三个函数头分别设置了断点,发现了cout的执行顺序实际上是:
myStrnCpy--->myStrCpy--->myStrLen,执行过程中把结果先缓存起来,全部执行完毕后按照代码内的给出的顺序进行输出,由于三个函数指向的是同一个地址,所以导致myStrCpy的结果将myStrnCpy的结果覆盖掉了。其实myStrLen读取的字符串长度也是被覆盖掉的,并不是最一开始的字符串,只不过两个字符串长度恰好一样。
为了更加深刻的体现cout的执行顺序,我改编了一道IBM的面试题,代码如下:
#include <iostream>
using namespace std;
int aun()
{
cout << "a";
return 1;
}
int bun()
{
cout << "b";
return 2;
}
int cun()
{
cout << "c";
return 3;
}
int main()
{
int i = 1;
cout << "m" << aun() << bun() << cun() << endl;
return 0;
}
运行结果为:
cbam123
上述运行结果很明显地将cout的工作方式体现了出来。