【发布时间】:2015-02-27 16:00:09
【问题描述】:
我是新手。所以请多多包涵,
#include<stdio.h>
int abc(int k)
{
k++;
}
int main()
{
int a=1;
printf("%d",abc(a));
return 0;
}
上述程序的输出是:1
我的问题是输出不应该是“2”,因为实际参数将“1”的值传递给形式参数,并且它必须由函数 abc 递增。
当我将函数调用更改为
printf("%d",abc(1));
输出是一些垃圾值。
参数传递在这里是如何工作的?请解释一下。
【问题讨论】:
-
总是在编译时启用警告。
-Wall -Wextra至少。这会泄露warning: control reaches end of non-void function告诉你你没有从abc返回任何东西。 -
你的程序错了,因为函数
abc应该返回一个int,但它永远不会返回。因此,您的程序不会崩溃只是偶然的。为避免将来出现这种情况,请使用-Wall标志 (gcc/clang) 或在编译器选项 (Visual Studio) 中启用编译器警告。它会说诸如“警告:某些代码路径不返回值”之类的内容,这将使您提前意识到自己的错误。 -
@DavidC.Rankin 我认为
-Wextra对于初学者来说可能太烦人了。当你使用-Wextra时,有时需要样板来获得干净的编译(想想未使用的参数) -
@GiulioFranco,这取决于。在少数情况下,
-Wextra需要的不仅仅是确保您的比较是正确的。请参阅:-Wextra how useful is it really? 它的作用是迫使您 (1) 理解编译器告诉您的内容和 (2) 编写正确的代码。无论是初学者还是专家,当编译器能够识别出问题所在并为您提供足够描述性的警告以指出您正确的修复方向时,草率的代码就没有任何借口了。 -
@DavidC.Rankin 如果您是专家,您可能会根据每个警告决定禁用哪些警告。如果您是新手,您只是让我相信最好启用所有功能。
标签: c function parameter-passing