Python中未定义的行为

问题描述 投票:4回答:3

在C或C ++中,我知道有一些东西叫做

未定义的行为

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

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

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

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

python c++ c
3个回答
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

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

是的,在函数调用是表达式。


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之前还是之后计算的。 +运算符的操作数的评估顺序是未指定的,因此我们无法知道哪个操作数首先被评估,也不应该编写依赖于某个顺序的代码。

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

这些例子之间的区别在于副作用发生的地方。见Undefined behavior and sequence points


0
投票

如果cglobal变量,并且g()使相同的c成为5的值,意味着这是unspecified behaviour

注意,Python解释器从左到右评估表达式,这意味着当c被添加到f() + g()时它将是5。

© www.soinside.com 2019 - 2024. All rights reserved.