我使用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);
}
答案 0 :(得分:4)
add
应该返回int
但你在函数末尾没有return
语句,所以你要调用undefined behavior,所以我们无法推理结果。 6.9.1
功能定义段 12 中的C99 draft standard说:
如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。
可能没有直接相关但仍然重要的是main
应该返回int
而不是void
,5.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次调用可能会有所不同。