什么叫做未定义行为

一、未定义行为

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调用谁在前谁在后。


需要注意的是,不要和逗号表达式弄混,逗号表达式可以参考这篇文章:https://blog.csdn.net/qq_41112517/article/details/78808291

参考: 《C程序设计语言(第2版)》 P43

3.通过指针直接修改 const 常量的值


直接通过赋值修改const变量的值,编译器会报错,但通过指针修改则不会。

 

 

 

二、 复合语句

(单选题)以下程序的输出的结果是()。
int a = 3;
main()
{ int s = 0;
{ int a = 5; s += a++; }  
s += a++; printf("%d\n", s); 
}


      复合部句中定义的变量如果与全局变量同名,那么在复合语句中对该变量的引用是指复合语句中定义的变量,而不是全局变量。所以,程序中复合语句内s+=a++;执行的结果将使得s的值为s=s+5=0+5=5,复合语句执行完后,再执行s+=a++;此时的a是指全局变量,s的值将是s=s+3=5+3=8。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值