【发布时间】:2020-02-09 20:30:27
【问题描述】:
请注意,我使用的是 Turbo C++ 编译器,因为我们应该只为学校教学大纲学习 Turbo C++。这就是为什么在这种情况下,cout 语句是从右到左计算的。
计划
#include <iostream.h>
#include <string.h>
void func(char *s, char t[]) {
strcpy(t, "Have fun");
s = "Be\0Cool";
cout << s[0] << ++s << s++ << --s << strupr(s+2) << ++s << s++ << s;
}
int main() {
char x[] = "Hello World!!!", y[] = "Hello World";
func(x, y);
cout << x << y;
return 0;
}
输出
CCOOLeeOOLBeBeBeBeBeHello World!!!玩得开心
我觉得输出应该是:
C酷eeOOLBeBeHello World!!!玩得开心
因为在cout 语句的++s 部分(第二个位置),指针位于字符串s 的索引3,因此只应打印“Cool”。相反,正在打印“酷”。为什么会这样?
【问题讨论】:
-
未定义的行为以及
strupr转换整个字符串的事实。 -
because we are supposed to learn only Turbo C++ for our school syllabus太糟糕了。 -
"Turbo C++" == "浪费你的时间"。该编译器永远将与您未来的生活相关,并且它教给您的(不是 C++)语言是您必须学习的东西。不要把你的时间浪费在那些过时的废话上......
-
@Sujit 它确实改变了字符串。它不会神奇地在以太中的某个地方创造空间,转换为大写并存储在那个空间中,然后返回一个指向相同的指针。随之而来的内存泄漏将是可怕的。它就地转换。返回的结果
char*便于在表达式中使用。无论如何,cout链调用 UB,简单明了。 -
@Sujit 编写这种依赖于未定义行为的代码没有任何意义,尝试理解它更没有意义。 使用多个语句编写正确的代码。