为什么这两个程序提供不同的输出?

时间:2013-09-12 14:29:09

标签: c compiler-construction operating-system

我使用gcc编译器在Linux系统上尝试了以下程序,两者都提供不同的输出。任何人都可以解释结果吗?

计划1

#include<stdio.h>

int i=10;

int add(){
  printf("hai");
  i=i+1;
}

void main(){
  int k;
  k=add();
  printf("%d",k);
}

计划2

#include<stdio.h>

int add(){
      int i=10;
      printf("hai");
      i=i+1;
}

void main(){
     int k;
     k=add();

     printf("%d",k);
}

4 个答案:

答案 0 :(得分:4)

add应该返回int但你在函数末尾没有return语句,所以你要调用undefined behavior,所以我们无法推理结果。 6.9.1 功能定义 12 中的C99 draft standard说:

  

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

可能没有直接相关但仍然重要的是main应该返回int而不是void5.1.2.2.1 计划启动中的C99草案标准 1 说:

It shall be defined with a return type of int and with no parameters:

  int main(void) { /* ... */ }

or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):

   int main(int argc, char *argv[]) { /* ... */ }

答案 1 :(得分:2)

您的程序有未定义的行为,函数add应该返回int但没有return语句来实际返回值。从代码中,我猜你想要的是:

int i = 10;
int add(){
  printf("hai");
  i=i+1;
  return i;  //here
}

另一个是相似的,试试看结果。

另一个未定义的行为是void main,因为SO中的许多帖子已经说过,您应该始终使用int main(void)。请参阅 here ,以便对此进行详细讨论。

答案 2 :(得分:1)

在两个程序中,您都没有从add()函数返回任何内容。并且k之前没有初始化。

add()的返回值是任何意外值。

尝试打印i值,或在函数return中添加add()语句

尝试1

#include<stdio.h>
void add();
int i=10;
void add(){
  i=i+1;
}
void main(){
add(); 
printf("%d",i); 
//i is global variable so changes made in function will gets effectes here and prints 11
}  

尝试2

#include<stdio.h>
int add();
int i=10;
int add(){
  return i+1; //return i+1 
}
void main(){
int k;
k=add();
printf("%d",k); //here k value will modify but i value does not. print i value also
}

尝试3

#include<stdio.h>
void add();
void add(){
  int i=10; //i is local to add() function.
  i=i+1;     
}
void main(){
int i=10;
add();
printf("%d",i); //now i value wont change because i is local to main
}

答案 3 :(得分:0)

'add'函数不返回任何值。返回的内容可能是垃圾值,对于两个程序甚至可能对同一程序进行2次调用可能会有所不同。