刷c语言练习题8(牛客网)

时间:2024-10-14 07:20:20

6、下列 C 代码中,不属于未定义行为的有:______。

A、int i=0; i=(i++);

B、char *p="hello"; p[1]='E';

C、char *p="hello"; char ch=*p++;

D、int i=0; printf("%d %d\n",i++,i--);

E、都是未定义行为

F、都不是未定义行为

答案:C

解析:未定义行为(Undefined Behavior)在C语言(以及C++等其他编程语言)中是一个重要的概念,它指的是程序执行时的行为在当前程序状态下的行为在其所使用的语言标准中没有规定。换句话说,当程序执行到某个点时,由于某些原因(如错误的程序结构、错误的数据使用等),其行为变得不可预知,并且语言标准也没有对这种情况下的行为做出任何规定。

A选项中的i=(i++),执行i++,先返回i的当前值再进行自增操作,下面是将一个值赋值给i和i++这两个操作,两个操作都会改变i的值,并且没有规定哪个操作应该先执行,所以结果是不确定的,产生未定义行为。

B选项中利用指针去修改一个字符串常量的值,B选项错误。

D选项中两个都是后缀递增递减,但是两个操作之间的顺序并没有定义,由于两个操作执行顺序的不同会产生不同的结果,是未定义行为。

综上,本题选择选项C。

常见的未定义操作有:

1、数组的越界访问:访问数组时超出了其定义的大小。

2、指针解引用:解引用空指针或者野指针。

3、悬空指针:使用已经释放的指针。

4、整数溢出:整数类型运算结果超出了该类型能表示的范围。

5、函数返回局部变量的地址:函数返回局部变量的地址,并在函数外部使用该地址。

6、使用未初始化的变量。

7、变量既是左边结果,又是右边的操作数。