2

我使用编译器在 Linux 系统上尝试了以下程序gcc,两者都给出不同的输出。谁能解释一下结果?

程序 1

#include<stdio.h>

int i=10;

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

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

方案二

#include<stdio.h>

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

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

     printf("%d",k);
}
4

4 回答 4

4

add应该返回 an但您在函数末尾int没有声明,因此您正在调用未定义的行为,因此我们无法推断结果。功能定义12段中的C99 标准草案说:return6.9.1

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

可能不直接相关但仍然重要的是main应该返回而int不是,程序启动1void节中的 C99 草案标准说:5.1.2.2.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[]) { /* ... */ }
于 2013-09-12T14:32:45.223 回答
2

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

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

另一个类似,试试看结果。

另一个未定义的行为是void main,正如 SO 中的许多帖子已经指出的那样,您应该始终使用int main(void). 在这里寻找一个很好的讨论。

于 2013-09-12T14:39:58.563 回答
1

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

返回值 fromadd()是任何意外值。

要么尝试打印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
}
于 2013-09-12T14:36:07.937 回答
0

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

于 2013-09-12T14:33:41.010 回答