所以,为了理解目的,我在这个简单的程序中做了一些更改。 这是代码:
#include<stdio.h>
add1(int a,int b){
int j = a + b; // Statement-1
int y = a - b; // Statement-2
}
void main() {
int result = add1(5,7);
printf("%d",result);
}
我知道C函数的默认返回类型为int
,如果函数为{,则默认返回值为return 0
{1}},否则如果函数确实返回了某些内容,则返回值是未定义的。我知道这不是一个好习惯。但这是我的观察:
main
的返回值将最接近的声明变量的值作为add1
函数的结束括号,即在我的代码add1
中。因此,输出 -2 。如果我评论y
,则输出变为 12 。
那么,这就是我们所说的未定义的行为?
答案 0 :(得分:2)
是。一旦存在未定义的行为,结果可能是预期的或意外的。
undefined :任何事情都可能发生;标准没有要求。程序可能无法编译,或者可能无法正确执行(崩溃或静默生成不正确的结果),或者它偶然可能完全符合程序员的意图。
编译器在面对未定义的行为时(或在限制范围内,使用实现定义和未指定的行为)可以执行任何喜欢的操作,包括执行您期望的操作。但是依靠它是不明智的。
答案 1 :(得分:2)
是。 N1256(C99)的§6.9.1¶12声明:
如果到达终止函数的
}
,并且调用者使用了函数调用的值,则行为未定义。
答案 2 :(得分:2)
您似乎在说您的编译器似乎返回最后定义的变量的值,并且想知道该特定算法是否是“未定义行为”的含义。实际上,特定编译器使用的算法(如果有的话)以某种方式设置返回值,并不能真正证明未定义行为的概念。
查看事物的正确方法是语言规范允许(符合标准)编译器生成代码,该代码执行它想要的任何内容来设置返回值(或崩溃或进入无限循环)。
您似乎发现您的编译器某些特定事物的事实实际上有点无关紧要。它没有必要做你发现它做的事情。它本可以做其他事情。
并非有人问过,但您所看到的可能是C编译器中通常会发生的结果:函数返回的值是函数退出时恰好保存在特定处理器寄存器中的值。您的编译器似乎将其计算直接定位到该特殊寄存器中。所以,是的,你看到你所看到的东西是有意义的(至少对编译器编写者而言)。
但它不一定是这样。这样的事实只是同意未定义行为的语言要求,但它不是“未定义行为的含义”。
也许这只是一个挑剔,但它反映了我如何阅读这个问题。