C
语言的初学者经常会问一些貌似
“
专业
”
的问题,比如
#include <stdio.h>
int main()
{
int i = 5;
int j = ++i+++i+++i;
printf("%d\n", j);
return 0;
}
这样的问题实在不需要多做考虑,
而且应该在实际编程实践中尽量避免。
因为它们几乎都是
“
未指明的行为
”
或
“
由实现定义的行为
”
。另一方面,程序的错误或
Bugs
,通常是由于
“
未定
义的行为
”
。
C++Primer
第四版中的解释:
使用了未定义行为的程序都是错误的,
即使程序能够运行,
也只是巧合。
未定义行为源
于编译器不能检测到的程序错误或太麻烦以至无法检测的错误。
不幸的是,
含有未定义行为的程序在有些环境或编译器中可以正确执行,
但并不能保证
同一程序在不同编译器中甚至在当前编译器的后继版本中会继续正确运行,
也不能保证程序
在一组输入上可以正确运行且在另一组输入上也能正确运行。
程序不应该依赖未定义行为
语言的初学者经常会问一些貌似
“
专业
”
的问题,比如
#include <stdio.h>
int main()
{
int i = 5;
int j = ++i+++i+++i;
printf("%d\n", j);
return 0;
}
这样的问题实在不需要多做考虑,
而且应该在实际编程实践中尽量避免。
因为它们几乎都是
“
未指明的行为
”
或
“
由实现定义的行为
”
。另一方面,程序的错误或
Bugs
,通常是由于
“
未定
义的行为
”
。
C++Primer
第四版中的解释:
使用了未定义行为的程序都是错误的,
即使程序能够运行,
也只是巧合。
未定义行为源
于编译器不能检测到的程序错误或太麻烦以至无法检测的错误。
不幸的是,
含有未定义行为的程序在有些环境或编译器中可以正确执行,
但并不能保证
同一程序在不同编译器中甚至在当前编译器的后继版本中会继续正确运行,
也不能保证程序
在一组输入上可以正确运行且在另一组输入上也能正确运行。
程序不应该依赖未定义行为