【问题标题】:why these two programs giving different outputs?为什么这两个程序给出不同的输出?
【发布时间】:2013-09-12 14:29:09
【问题描述】:

我在 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);
}

方案 2

#include<stdio.h>

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

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

     printf("%d",k);
}

【问题讨论】:

    标签: c compiler-construction operating-system


    【解决方案1】:

    add 应该返回一个int,但你在函数末尾没有return 语句,所以你正在调用undefined behavior,所以我们无法推断结果。 C99 draft standard 部分 6.9.1 函数定义 段落 12 中说:

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

    可能不直接相关但仍然很重要的是main 应该返回并且int 不是void,C99 标准草案在5.1.2.2.1 部分中程序启动 段落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[]) { /* ... */ }
    

    【讨论】:

    • 很高兴知道您已经给出了一些答案,但我听说 printf 正在返回一些值,因此它将存储在寄存器中,这可以由调用函数获取,正如我们在 program2 中看到的那样。你知道吗? @shafik
    • @user2773010:这不是定义的行为,不要指望它。
    • @user2773010 当您处理未定义的行为时,您有时可以很好地猜测会发生什么,但这将取决于编译器、平台等。这只是一个猜测。 Deep C and C++ 是一个很好的介绍,但请只做这种类型的东西来学习。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      试试 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
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】: