没有返回类型的C函数的未定义行为

时间:2014-05-24 06:04:08

标签: c undefined-behavior

所以,为了理解目的,我在这个简单的程序中做了一些更改。 这是代码:

#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

那么,这就是我们所说的未定义的行为

3 个答案:

答案 0 :(得分:2)

是。一旦存在未定义的行为,结果可能是预期的或意外的。

C faq - 11.33

  

undefined :任何事情都可能发生;标准没有要求。程序可能无法编译,或者可能无法正确执行(崩溃或静默生成不正确的结果),或者它偶然可能完全符合程序员的意图。

C faq - 11.35

  

编译器在面对未定义的行为时(或在限制范围内,使用实现定义和未指定的行为)可以执行任何喜欢的操作,包括执行您期望的操作。但是依靠它是不明智的。

答案 1 :(得分:2)

是。 N1256(C99)的§6.9.1¶12声明:

  

如果到达终止函数的 } ,并且调用者使用了函数调用的值,则行为未定义。

答案 2 :(得分:2)

您似乎在说您的编译器似乎返回最后定义的变量的值,并且想知道该特定算法是否是“未定义行为”的含义。实际上,特定编译器使用的算法(如果有的话)以某种方式设置返回值,并不能真正证明未定义行为的概念。

查看事物的正确方法是语言规范允许(符合标准)编译器生成代码,该代码执行它想要的任何内容来设置返回值(或崩溃或进入无限循环)。

您似乎发现您的编译器某些特定事物的事实实际上有点无关紧要。它没有必要做你发现它做的事情。它本可以做其他事情。

并非有人问过,但您所看到的可能是C编译器中通常会发生的结果:函数返回的值是函数退出时恰好保存在特定处理器寄存器中的值。您的编译器似乎将其计算直接定位到该特殊寄存器中。所以,是的,你看到你所看到的东西是有意义的(至少对编译器编写者而言)。

但它不一定是这样。这样的事实只是同意未定义行为的语言要求,但它不是“未定义行为的含义”。

也许这只是一个挑剔,但它反映了我如何阅读这个问题。