C语言undefined behaviour未定义行为
2015-08-28 09:31
281 查看
C语言中的未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。
所以,避免未定义行为,是个明智的决定。本文将介绍几种未定义行为,同时欢迎读者纠错和补充。
1.同一运算符中多个操作数的计算顺序(&&、||、?和,运算符除外)
例如:x = f()+g(); //错误
f()和g()谁先计算由编译器决定,如果函数f或g改变了另一个函数所使用变量的值,那么x的结果可能依赖于这两个函数的计算顺序。
参考: 《C程序设计语言(第2版)》 P43
2.函数各参数的求值顺序
例如: printf(“%d,%d\n”,++n,power(2,n)); //错误
在不同的编译器可能产生不同的结果,这取决于n的自增运算和power调用谁在前谁在后。
需要注意的是,不要和逗号表达式弄混,都好表达式可以参考这篇文章:c语言中逗号运算符和逗号表达式
参考: 《C程序设计语言(第2版)》 P43
3.通过指针直接修改 const 常量的值
直接通过赋值修改const变量的值,编译器会报错,但通过指针修改则不会,例如:
Python
int main()
{
const int a = 1;
int b = (int)&a;
*b = 21;
}
a输出值也由编译器决定。
所以,避免未定义行为,是个明智的决定。本文将介绍几种未定义行为,同时欢迎读者纠错和补充。
1.同一运算符中多个操作数的计算顺序(&&、||、?和,运算符除外)
例如:x = f()+g(); //错误
f()和g()谁先计算由编译器决定,如果函数f或g改变了另一个函数所使用变量的值,那么x的结果可能依赖于这两个函数的计算顺序。
参考: 《C程序设计语言(第2版)》 P43
2.函数各参数的求值顺序
例如: printf(“%d,%d\n”,++n,power(2,n)); //错误
在不同的编译器可能产生不同的结果,这取决于n的自增运算和power调用谁在前谁在后。
需要注意的是,不要和逗号表达式弄混,都好表达式可以参考这篇文章:c语言中逗号运算符和逗号表达式
参考: 《C程序设计语言(第2版)》 P43
3.通过指针直接修改 const 常量的值
直接通过赋值修改const变量的值,编译器会报错,但通过指针修改则不会,例如:
Python
int main()
{
const int a = 1;
int b = (int)&a;
*b = 21;
printf("%d, %d", a, *b); return 0;
}
a输出值也由编译器决定。
相关文章推荐
- Effective C++——条款8(第2章)
- C++ string学习
- 关于C++的模板偏特化和萃取编程技法
- POJ C++程序设计 编程题#3 编程作业—多态与虚函数
- C++的数据类型
- C++的数据类型
- POJ C++程序设计 编程题#2 编程作业—多态与虚函数
- POJ C++程序设计 编程题#1 编程作业—多态与虚函数
- C语言堆栈入门——堆和栈的区别
- C语言中的abs()函数和exp()函数的用法
- C语言之指针与地址
- C语言的数学计算库
- php大力力 [033节] 随便看看:PHP程序员学习C++
- [C++11 并发编程] 14 关联任务与期望
- Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。
- C语言 文件单词的检索与计数
- 一个C语言典型的内存泄露问题
- c++多态总结
- A*算法的C++实现
- volatile变量的一个例子