浅谈未定义行为(Undefined behavior)

一、维基百科:


参考:http://zh.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA


在计算机编程中,未定义行为(英语:Undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。[1]在这些语言中,为了简化标准,并给予实现(根据我的理解,这里的“实现”指的是编译器)一定的灵活性,标准特别地规定某些操作的结果是未定义的,这意味着程序员不能预测会发生什么事。


二、实例

请看我在csdn的php发过的一个帖子:http://bbs.csdn.net/topics/390620212?page=1#post-395840234

1.php代码:

<?php 
$a = 1;
$c = $a+$a++;
var_dump($c); // result:3

$a = 1;
$c = $a+$a+$a++;
var_dump($c); //result:3

我的理解:第一个结果应该是2,第二个结果应该是3
打印输出:

int 3
int 3

2.c代码:(这段代码我运行在 codepad上:  http://codepad.org/J6leZd7a)

#include<stdio.h>
int main() {
    int a = 1;
    printf("a=%d\n",a+a++);
    a = 1;
    printf("a=%d\n",a+a+a++);
    return 0;
}

输出:

a=2
a=3

但是,PHP版的版主回复我:

浅谈未定义行为(Undefined behavior)_第1张图片


结果竟然也是 

a=3
a=3

原因:

维基百科:
在计算机编程中,未定义行为(英语:Undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。[1]在这些语言中,为了简化标准,并给予实现一定的灵活性,标准特别地规定某些操作的结果是未定义的,这意味着程序员不能预测会发生什么事。


恩,就是这么回事了。。。


三、其他一些未定义行为的例子:

除以零会导致未定义的行为。根据 IEEE 754,float,double,和long double类型的值除以零的结果是无穷大或NaN[3]

return x/0; // 未定义的行为

某些指针操作可能导致未定义的行为:[4]

int arr[4] = {0, 1, 2, 3};
int* p = arr + 5;  // 未定义的行为

到达返回数值的函数(除main函数以外)的结尾,而没有一个return语句,会导致未定义的行为:

int f()
{
}  /* 未定义的行为 */

《C程序设计语言》在第2.12节引用下面的代码作为未定义行为的例子:

printf("%d %d\n", ++n, power(2, n));    /* 错误 */

以及

a[i] = i++;


你可能感兴趣的:(浅谈未定义行为(Undefined behavior))