我不知道';我不明白我的编译器是如何得到这个输出的 请注意,我使用的是Turbo C++编译器,因为我们应该只学习Turbo C++的课程大纲。这就是为什么在本例中,cout语句是从右向左求值的

我不知道';我不明白我的编译器是如何得到这个输出的 请注意,我使用的是Turbo C++编译器,因为我们应该只学习Turbo C++的课程大纲。这就是为什么在本例中,cout语句是从右向左求值的,c++,turbo-c++,C++,Turbo C++,节目 #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++ <&

节目

#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;
}
#包括
#包括
void func(字符*s,字符t[]{
strcpy(t,“玩得开心”);
s=“Be\0Cool”;

cout使用Visual Studio 2019进行测试

出于比较目的,在Visual Studio 2019(调试)中,如果我们对代码进行编译所需的更改,那么程序将崩溃,因为我们试图修改常量字符串(
“Be\0Cool”

如果我们进行额外更改以避免崩溃(通过使用本地数组),则输出为:

你好,世界!!!玩得开心


如果我们拆分代码>未定义的行为,并且代码< StruPR> <代码>转换整个字符串。<代码>,因为我们只应该学习Turbo C++用于我们学校的教学大纲<代码>太糟糕了。“Turbo C++”=“浪费你的时间”。编译器永远不会在你的生活中前进,而不是(C++)。它教给你的语言是你将不得不去学的东西。不要把你的时间浪费在那些过时的废话上。@Sujit它确实改变了字符串。它不会神奇地在以太中的某个地方腾出空间,转换成大写字母并存储在该空间中,然后返回一个指针指向所说的相同的内容。随之而来的内存泄漏将是可怕的。它会转换返回的

char*
便于在表达式中使用。无论如何,
cout
chain调用UB,简单明了。@Sujit编写这种依赖于未定义行为的代码没有任何意义,尝试理解它更没有意义。使用多个语句编写正确的代码。
B
e
e
e
COOL


COOL
Hello World!!!
Have fun
Be
Be

OOL
e
e
COOL
C
Hello World!!!
Have fun