【发布时间】:2015-07-19 17:54:42
【问题描述】:
我是编程新手,我在定义函数之前阅读了我们需要定义它的原型。如果我们不希望我们的函数接受任何值,那么我们将 void 作为参数写入。所以只是为了检查它,我写了这个小程序,在定义函数原型时,我把它的参数写为 void,而在写它的定义时,它写了 int a 作为它的参数(希望我会得到一个错误,但我从来没有得到一个)。然后我编译并运行它给我这个输出的程序
这个程序打印从 1 到 3 的所有数字的平方
1 的平方是 1:
2 的平方是 4:
3的平方是9:
在此之后,我将定义中的参数更改为 float a(只是为了检查程序是否仍然可以工作),这次我得到了不同的输出,如下所示
这个程序打印从 1 到 3 的所有数字的平方
1的平方是0:
2的平方是0:
3的平方是0:
.
谁能解释一下这里发生了什么?为什么我的编译器没有抛出错误,为什么我得到两个完全不同的 int 和 float 输出?我正在使用带有更新 4 的 Visual Studio Professional 2013!
//program to calulate square using functions
#include <stdio.h>
#pragma warning (disable:4996)
int square(void);
int main()
{
int i;
printf("This program prints the square of all the numbers starting from 1 to 3");
for (i = 1; i <= 3; i++)
printf("\n\nthe square of %d is %d : \t",i,square(i));
getch();
return 0;
}
square(a)
{
a = a*a;
return a;
}
【问题讨论】:
-
一方面我想回答未定义的行为,另一方面我想回答与旧标准(甚至预标准)的向后兼容性。
-
@JoachimPileborg 先生,请随时回答他们两个问题! :)
-
另外,您禁用的警告是什么?你不应该禁用警告,因为它们通常表明你做了一些你不应该做的事情,并且可能导致未定义的行为。
-
@JoachimPileborg 我禁用了 Visual Studio 一直希望我使用 scanf_s 而不是 scanf 的警告!
-
“我禁用了警告...”。我已经将其作为近距离投票的理由(无法复制)。您禁用警告并想知道为什么您的编译器不抱怨?