Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IO执行在同一语句中调用的函数:未定义还是未指定? 我开始从C++入门(第五版)学习C++。通过阅读有关表达式的章节,我想出了一个示例程序,让我感到疑惑: int f1() { cout << "f1\n"; return 1; } int f2() { cout << "f2\n"; return 2; } int main() { int i = f1() + f2(); return 0; } intf1() { cout_C++ - Fatal编程技术网

IO执行在同一语句中调用的函数:未定义还是未指定? 我开始从C++入门(第五版)学习C++。通过阅读有关表达式的章节,我想出了一个示例程序,让我感到疑惑: int f1() { cout << "f1\n"; return 1; } int f2() { cout << "f2\n"; return 2; } int main() { int i = f1() + f2(); return 0; } intf1() { cout

IO执行在同一语句中调用的函数:未定义还是未指定? 我开始从C++入门(第五版)学习C++。通过阅读有关表达式的章节,我想出了一个示例程序,让我感到疑惑: int f1() { cout << "f1\n"; return 1; } int f2() { cout << "f2\n"; return 2; } int main() { int i = f1() + f2(); return 0; } intf1() { cout,c++,C++,关于“未定义的行为”的话题在网站上相当令人讨厌。在相当长的一段时间里,有很多问题问“这是未定义的行为吗?”回答者匆忙回答“是”,而事实并非如此。我相信你所想的是这样的情况: 运算符操作数的值计算按顺序排列 在计算运算符结果的值之前。如果 对标量对象的影响相对于另一个对象不排序 对同一标量对象或使用 相同标量对象的值,并且它们不可能 并发(1.10),行为未定义 [示例: -[结束示例] 修改对象和调用库I/O函数都是副作用。除此之外,没有任何关系表明您的示例具有未定义的行为 我遇到的另一个问题是

关于“未定义的行为”的话题在网站上相当令人讨厌。在相当长的一段时间里,有很多问题问“这是未定义的行为吗?”回答者匆忙回答“是”,而事实并非如此。我相信你所想的是这样的情况:

运算符操作数的值计算按顺序排列 在计算运算符结果的值之前。如果 对标量对象的影响相对于另一个对象不排序 对同一标量对象或使用 相同标量对象的值,并且它们不可能 并发(1.10),行为未定义

[示例:

-[结束示例]

修改对象和调用库I/O函数都是副作用。除此之外,没有任何关系表明您的示例具有未定义的行为

我遇到的另一个问题是,回答者宁愿扔掉一堆听起来不错的标准语,而这些标准语比人性化版本更难解析。因此,人们往往会忽略全局。以下是一个示例:

§1.9/15对于每个函数调用F,对于每个评估A 在F中发生的,以及未发生的每个评估B 在F中,但在同一线程上计算,并作为同一线程的一部分 信号处理程序(如果有),A在B之前排序,或B在 在A之前排序

翻译:如果A和B没有顺序,那么它们是不确定顺序。根据定义,不确定顺序意味着它们可以以任何顺序出现,但不能重叠

此外,在不精确的术语中,
+
运算符的操作数是未排序的。因此,
+
不表示“序列点”。因此,
f1()
f2()
是不确定的序列,您可以推断这是未指定的行为

忘了标准吧,集中精力学习语言。你太沉迷于细节,看不到大局,把事情搞糊涂了

程序的行为因实现而异,一致性实现不需要记录每个行为的影响。例如,评估顺序,相同的字符串是否不同,数组分配开销的大小等。每个未指定的行为都会导致一组对有效结果的分析

[P>[t]这里没有C++中的左右到左的概念,这与操作符的左到右和右到左的关联性不相混淆:表达式f1(+)+f2()+f3()被解析为(f1(+)+f2())+f3()由于运算符+从左到右的关联性,对f3的函数调用可以在运行时首先、最后或在f1()或f2()之间求值。

如果秩序很重要,你就要这样做

int a = f1();
int b = f2();
int i = a + b;

如果顺序不重要,那么代码就很好。

这是未指定的行为。在C++03语言中,每个函数调用前后都有一个序列点。C++11语言用不同的术语表示相同的事情。但是,有一个建议指定求值顺序。但没有未定义的行为;任何行为在函数中,将根据其他函数中的任何内容正确排序。人性化版本是可以的,只要它有证据,并且没有超出标准的权威证据来源。我们有足够的关于堆栈溢出的未分配、未来源的信息,误导了整整一代程序员o编写危险的代码。因此,我认为你对标签中正确答案的咆哮是无效的;这肯定不是建设性的。
int a = f1();
int b = f2();
int i = a + b;