C语言undefined behaviour未定义行为
来源:互联网 发布:java数组和链表的区别 编辑:程序博客网 时间:2024/05/16 05:51
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变量的值,编译器会报错,但通过指针修改则不会,例如:
int main(){ const int a = 1; int *b = (int*)&a; *b = 21; printf("%d, %d", a, *b); return 0;}
a输出值也由编译器决定。
转载地址:http://www.itoldme.net/archives/904
0 0
- C语言undefined behaviour未定义行为
- C语言undefined behaviour未定义行为
- C语言undefined behaviour未定义行为
- C语言undefined behaviour未定义行为
- C语言undefined behaviour未定义行为
- C语言undefined behaviour未定义行为
- C语言的未定义行为(undefined behaviour)
- C语言未定义行为
- C语言的未定义行为
- C语言未定义行为一览
- C语言未定义行为一览
- C语言中的未定义行为
- c语言中的未定义行为
- C语言的未定义行为
- C语言(undefined behavior)未定义-序
- C/C++语言中的未定义行为
- 神奇的C语言--C语言未定义行为一览
- Undefined Behaviour
- 人工智能不会毁灭人类:机器更依赖人
- [leetcode-68]Text Justification(java)
- 在Windows的Tomcat环境下部署Solr 4.7.0
- 字符串转整数
- 计划策略-10-净需求计划
- C语言undefined behaviour未定义行为
- 随笔,在工作中遇到的问题(杂)
- 关于switch语句的一点介绍
- C++学习笔记
- 计划策略-11-毛需求计划
- WGS84,GCJ02, BD09坐标转换
- java中length,length(),size()区别
- 【c++】用string类定义字符串数组
- 第一天:坐标转换(2014/7/30)