gpt4 book ai didi

c# - 括号和赋值运算符顺序

转载 作者:太空狗 更新时间:2023-10-29 23:32:36 24 4
gpt4 key购买 nike

我正在编写 C 表达式解析器并发现了我不理解的行为:

#include <iostream>
#include <sstream>

int main()
{
std::string string1;
std::string string2 = std::string((string1 = std::string("first")) + " " + (string1 = std::string("second")));

std::cout << string1 << std::endl;
std::cout << string2 << std::endl;

int int1;
int int2 = (int1 = 1) + (int1 = 2);

std::cout << int1 << std::endl;
std::cout << int2 << std::endl;

std::cin.get();

return 0;
}

输出:

first
first first
2
4

我预计:

second
first second
2
3

在 C# 中运行相同的程序时,我得到了预期的输出。你能解释一下那里到底发生了什么吗?

C# 代码:https://gist.github.com/Kukkimonsuta/59543cfc4f7f73b8bebd

最佳答案

此代码在 C++ 中具有未定义的行为,因为单个表达式会对同一变量产生多个副作用(即,对 string1 的两次赋值)。 int1 变量也是如此。

在您的情况下,编译器按照与您预期相反的顺序应用这两个副作用。即使它确实按照您预期的顺序应用了它们,该程序仍然无效。

When running the same program in C#, I get the expected output.

与 C++ 不同,C# 几乎没有将尽可能多的决定留给编译器开发人员。这些表达式的计算顺序,以及在 C++ 中产生未定义行为的许多其他表达式,均由语言标准明确定义。

关于c# - 括号和赋值运算符顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34483211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com