在 C 或 C ++ 中,我知道有一些名为
的内容未定义的行为
在表达式评估中,某些表达式具有副作用。假设我想计算以下内容:
c = 10
f() + g() + c
但在某些时候g使c = 5.(c是一个glob变量)
python中的行为是什么?它会被定义为 C 吗?
答案 0 :(得分:6)
来自python文档的6.15
Python从左到右评估表达式。请注意,在评估分配时,右侧会在左侧之前进行评估。
在以下几行中,表达式将按其后缀的算术顺序进行评估:
expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4) <----- This is of importance to us.
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2
所以这里的函数将按从左到右的顺序调用。因此,您将看到的任何更改都将归因于从左到右调用的函数。
在python函数调用中是的是表达式。
答案 1 :(得分:3)
C代码如下:
#include <stdio.h>
int c;
int f (void)
{
return 1;
}
int g (void)
{
return ++c;
}
int main()
{
c = 3;
printf("%d", f() + g() + c);
return 0;
}
不调用未定义的行为。但它会调用未指定的行为。这些是不同的正式术语:Undefined, unspecified and implementation-defined behavior
首先请注意,f() + g() + c
已分组为(f() + g()) + c
,但这不会告诉您实际评估这些术语本身的顺序。
此代码的结果可以是1 + (3+1) + 3 = 8
或1 + (3+1) + 4 = 9
,具体取决于操作数g()
是在操作数c
之前还是之后进行评估。 +
运算符的操作数的评估顺序是未指定,因此我们无法知道首先评估哪个操作数,也不应该编写依赖于某个顺序的代码。
代码只会提供上述两个结果中的任何一个,它不会做任何完全疯狂的事情,比如崩溃或给出垃圾结果,包含 undefined 行为的代码可以做到。未定义行为的示例是c++ + c++
。
示例之间的区别在于副作用发生的位置。见Undefined behavior and sequence points
答案 2 :(得分:0)
如果c
是global
变量,并且g()
使c
的值5
为unspecified behaviour
,则意味着c
1}}。
注意,Python解释器从左到右评估表达式,这意味着当f() + g()
添加到driver.get('http://your_url')
时,driver.manage().window().maximize();
将为5。