Python中未定义的行为

时间:2018-03-01 11:09:03

标签: python c++ c

C C ++ 中,我知道有一些名为

的内容
  

未定义的行为

在表达式评估中,某些表达式具有副作用。假设我想计算以下内容:

c = 10
f() + g() + c

但在某些时候g使c = 5.(c是一个glob变量)

python中的行为是什么?它会被定义为 C 吗?

3 个答案:

答案 0 :(得分:6)

来自文档的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

所以这里的函数将按从左到右的顺序调用。因此,您将看到的任何更改都将归因于从左到右调用的函数。

函数调用中是的是表达式。

答案 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 = 81 + (3+1) + 4 = 9,具体取决于操作数g()是在操作数c之前还是之后进行评估。 +运算符的操作数的评估顺序是未指定,因此我们无法知道首先评估哪个操作数,也不应该编写依赖于某个顺序的代码。

代码只会提供上述两个结果中的任何一个,它不会做任何完全疯狂的事情,比如崩溃或给出垃圾结果,包含 undefined 行为的代码可以做到。未定义行为的示例是c++ + c++

示例之间的区别在于副作用发生的位置。见Undefined behavior and sequence points

答案 2 :(得分:0)

如果cglobal变量,并且g()使c的值5unspecified behaviour,则意味着c 1}}。

注意,Python解释器从左到右评估表达式,这意味着当f() + g()添加到driver.get('http://your_url')时,driver.manage().window().maximize(); 将为5。