gpt4 book ai didi

c - C 中的指针,异常行为

转载 作者:行者123 更新时间:2023-11-30 19:54:03 25 4
gpt4 key购买 nike

我正在尝试使用指针求圆的面积和周长。正确的代码如下所示

#include<stdio.h>

void main(){
int radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%d", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}

areaperi(int r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}

但是,如果我在声明和扫描半径时将半径的数据类型替换为 float ,并在 areaperi() 中更改 r 的类型,则会出现错误。

#include<stdio.h>

void main(){
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Area is %f\nPerimeter is %f", area, peri);
}

areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}

[Error]Conflicting types for areaperi

我使用 Dev C++。

我不明白为什么我的代码不适用于半径的 float 值。

最佳答案

这根本不是异常行为;这是 C 标准所要求的。

在调用areaperi()时,该函数的范围内没有原型(prototype)。因此,它被认为是一个返回 int 的函数,并且其参数受到默认提升 - float 被转换为 double 和任何比 int 短的整数类型(因此 shortchar)被提升为 int

当您将 areaperi() 的定义更改为:

areaperi(float r, float *a, float *b)

第一个参数的类型不再与推断的类型一致,因此您会收到错误。

您的函数应该在使用之前声明。它不返回值,因此应使用返回类型 void 声明和定义它。另外,main() returns an int 。回显输入和计算值是一个好主意,特别是当代码不检查 scanf() 调用是否成功时。

因此,您需要:

#include <stdio.h>

void areaperi(float r, float *a, float *b);

int main(void)
{
float radius;
float area, peri;
printf("Enter the radius of a circle: ");
scanf("%f", &radius);
areaperi(radius, &area, &peri);
printf("Radius is %f\nArea is %f\nPerimeter is %f",
radius, area, peri);
return 0;
}

void areaperi(float r, float *a, float *b){
*a = 3.14*r*r;
*b = 2*3.14*r;
}

这些规则存在的原因是与准标准 C 的“向后兼容性”。

请注意,C99 及更高版本要求在使用函数之前先声明函数,并且要求所有函数都具有显式返回类型。良好的做法是确保声明实际上是原型(prototype)。请注意,如果您在 main() 之前编写 void areperi();,它会声明该函数,但不会提供原型(prototype) - 它说areaperi() 是一个不返回任何值的函数,但未描述参数列表,并且可以是除可变长度参数列表之外的任何内容(它们需要原型(prototype),并且原型(prototype)具有 , . ..) 在最后)。

关于c - C 中的指针,异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com