一、维基百科:
参考: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
int 3 int 3
#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
结果竟然也是
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++;