将变量从全局更改为局部 - C
Changing a variable from global to local - C
我已经为一个项目编写了以下代码,但是它未能通过单一测试,要求两个变量不是全局变量,而是 main()
的局部变量。修改 structexample1.c
,使变量 student
和 anotherStudent
不是全局的,而是局部于 main 的。我模糊地理解局部和全局的概念,但我不确定如何在我编写的代码中实现问题的要求。
#include <stdio.h>
#include <stdlib.h>
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
struct student_s anotherStudent;
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
while (student != NULL) {
printOneStudent(*student);
student = student->next;
}
}
int main(void)
{
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
我知道我需要在 main()
中定义这些变量,但我不确定如何以不完全破坏我的代码的方式实现它们。代码的输出应保持如下:
Agnes McGurkinshaw (97), height 1.64 m
Jingwu Xiao (21), height 1.83 m
嗯,先替换这个:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
有:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
(即去掉最后一行的student
)。
这个更改是必要的,因为你想定义结构类型,以便以后可以定义struct student_s
类型的变量,但你不想在这里定义student
变量,因为这将使它成为全球性的。
然后删除这一行:
struct student_s anotherStudent;
最后,在使用前在 main()
中声明两个变量:
int main(void)
{
struct student_s student;
struct student_s anotherStudent;
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
全局变量是在任何函数之外声明的变量,它可以被在变量声明之后定义的任何函数使用:
void f1 () { } // Cannot access a
int a ;
void f2 () { } // Can get and set the value of a
void f3 () { } // Can also get and set the value of a
int main () { // Same as f1 and f2
f2 () ;
f3 () ;
printf("%d\n", a) ; // What is the output?
}
大多数时候,你不想使用全局变量,因为你真的不知道调用各种函数时它们会发生什么(见上面的例子,你不知道 a 的值是否有已被 f2
或 f3
) 修改。
局部变量只能在声明它的"scope"处使用:
void f1 () {
int a ;
}
int main () {
// a is not accessible here
}
在你的例子中,你声明了两个全局变量,但你没有全局使用它们(因为你在本地声明了同名变量,见下文),所以你应该简单地在你的 main 中本地声明它们:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} ; // Not student here
// No declaration here
void printOneStudent(struct student_s student) { /* ... */ }
void printStudents(const struct student_s* student) { /* ... */ }
int main (void) {
/* Declare student and anotherStudent here */
struct student_s student, anotherStudent ;
/* ... */
}
请注意,当您这样做时:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student ;
你在声明类型 struct student_s
的同时声明了变量 student
,而如果你在最后删除 student
,你仍然在声明 struct student_s
类型,但不再是 student
变量。
在您的代码中,您执行了以下操作:
struct student_s { /* ... */ } student ; // student is a global variable
void printOneStudent (struct student_s student) {
// Here student correspond to the argument, not to the global variable
}
// Example:
int a = 8 ;
void f (int a) {
printf("%d\n", a) ;
}
int main (void) {
f(5) ;
}
输出将是5
,而不是8
,因为在f
中名称a
对应于函数的参数,而不是全局变量。
没有太多内容。只需在 main 中声明它们。没有技巧。
// ConsCPP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
while (student != NULL) {
printOneStudent(*student);
student = student->next;
}
}
int main(void)
{
struct student_s student;
struct student_s anotherStudent;
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
在文件的顶部有一个 struct student_s {...} student;
.
这既定义了一个结构,又分配了其中的一个变量,student
。
下一行,struct student_s anotherStudent;
分配了它的另一个变量。
因为它们不是在函数内部声明的,所以它们是全局的。要使它们成为本地的,必须在函数中声明它们,例如:
int main()
{
int i;
定义了一个局部整型变量i
.
我不会提供代码;这是你的作业,但我希望我已经为你提供了足够的说明。
使用数组:
#include <stdio.h>
#include <stdlib.h>
#define NUM_OF_STUDENTS 2
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
int i;
for (i = 0; i < NUM_OF_STUDENTS; i++) {
printOneStudent(student[i]);
}
}
int main(void)
{
struct student_s student[NUM_OF_STUDENTS];
student[0].name = "Agnes McGurkinshaw";
student[0].age = 97;
student[0].height = 1.64;
student[1].name = "Jingwu Xiao";
student[1].age = 21;
student[1].height = 1.83;
printStudents(student);
return EXIT_SUCCESS;
}
与你的问题没有直接关系,但无论如何你应该避免这种情况:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
struct student_s anotherStudent;
而是这样写:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} ; // defines the structure
struct student_s student; // declares variable
struct student_s anotherStudent; // declares variable
这两种方法实际上是等价的,但是使用第二种方法,您可以清楚地将 struct student_s
的定义与两个变量 student
和 anotherStudent
的声明分开。这更具可读性。
我已经为一个项目编写了以下代码,但是它未能通过单一测试,要求两个变量不是全局变量,而是 main()
的局部变量。修改 structexample1.c
,使变量 student
和 anotherStudent
不是全局的,而是局部于 main 的。我模糊地理解局部和全局的概念,但我不确定如何在我编写的代码中实现问题的要求。
#include <stdio.h>
#include <stdlib.h>
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
struct student_s anotherStudent;
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
while (student != NULL) {
printOneStudent(*student);
student = student->next;
}
}
int main(void)
{
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
我知道我需要在 main()
中定义这些变量,但我不确定如何以不完全破坏我的代码的方式实现它们。代码的输出应保持如下:
Agnes McGurkinshaw (97), height 1.64 m
Jingwu Xiao (21), height 1.83 m
嗯,先替换这个:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
有:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
(即去掉最后一行的student
)。
这个更改是必要的,因为你想定义结构类型,以便以后可以定义struct student_s
类型的变量,但你不想在这里定义student
变量,因为这将使它成为全球性的。
然后删除这一行:
struct student_s anotherStudent;
最后,在使用前在 main()
中声明两个变量:
int main(void)
{
struct student_s student;
struct student_s anotherStudent;
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
全局变量是在任何函数之外声明的变量,它可以被在变量声明之后定义的任何函数使用:
void f1 () { } // Cannot access a
int a ;
void f2 () { } // Can get and set the value of a
void f3 () { } // Can also get and set the value of a
int main () { // Same as f1 and f2
f2 () ;
f3 () ;
printf("%d\n", a) ; // What is the output?
}
大多数时候,你不想使用全局变量,因为你真的不知道调用各种函数时它们会发生什么(见上面的例子,你不知道 a 的值是否有已被 f2
或 f3
) 修改。
局部变量只能在声明它的"scope"处使用:
void f1 () {
int a ;
}
int main () {
// a is not accessible here
}
在你的例子中,你声明了两个全局变量,但你没有全局使用它们(因为你在本地声明了同名变量,见下文),所以你应该简单地在你的 main 中本地声明它们:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} ; // Not student here
// No declaration here
void printOneStudent(struct student_s student) { /* ... */ }
void printStudents(const struct student_s* student) { /* ... */ }
int main (void) {
/* Declare student and anotherStudent here */
struct student_s student, anotherStudent ;
/* ... */
}
请注意,当您这样做时:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student ;
你在声明类型 struct student_s
的同时声明了变量 student
,而如果你在最后删除 student
,你仍然在声明 struct student_s
类型,但不再是 student
变量。
在您的代码中,您执行了以下操作:
struct student_s { /* ... */ } student ; // student is a global variable
void printOneStudent (struct student_s student) {
// Here student correspond to the argument, not to the global variable
}
// Example:
int a = 8 ;
void f (int a) {
printf("%d\n", a) ;
}
int main (void) {
f(5) ;
}
输出将是5
,而不是8
,因为在f
中名称a
对应于函数的参数,而不是全局变量。
没有太多内容。只需在 main 中声明它们。没有技巧。
// ConsCPP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
while (student != NULL) {
printOneStudent(*student);
student = student->next;
}
}
int main(void)
{
struct student_s student;
struct student_s anotherStudent;
student.name = "Agnes McGurkinshaw";
student.age = 97;
student.height = 1.64;
student.next = &anotherStudent;
anotherStudent.name = "Jingwu Xiao";
anotherStudent.age = 21;
anotherStudent.height = 1.83;
anotherStudent.next = NULL;
printStudents(&student);
return EXIT_SUCCESS;
}
在文件的顶部有一个 struct student_s {...} student;
.
这既定义了一个结构,又分配了其中的一个变量,student
。
下一行,struct student_s anotherStudent;
分配了它的另一个变量。
因为它们不是在函数内部声明的,所以它们是全局的。要使它们成为本地的,必须在函数中声明它们,例如:
int main()
{
int i;
定义了一个局部整型变量i
.
我不会提供代码;这是你的作业,但我希望我已经为你提供了足够的说明。
使用数组:
#include <stdio.h>
#include <stdlib.h>
#define NUM_OF_STUDENTS 2
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
void printOneStudent(struct student_s student)
{
printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}
void printStudents(const struct student_s* student)
{
int i;
for (i = 0; i < NUM_OF_STUDENTS; i++) {
printOneStudent(student[i]);
}
}
int main(void)
{
struct student_s student[NUM_OF_STUDENTS];
student[0].name = "Agnes McGurkinshaw";
student[0].age = 97;
student[0].height = 1.64;
student[1].name = "Jingwu Xiao";
student[1].age = 21;
student[1].height = 1.83;
printStudents(student);
return EXIT_SUCCESS;
}
与你的问题没有直接关系,但无论如何你应该避免这种情况:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} student;
struct student_s anotherStudent;
而是这样写:
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
} ; // defines the structure
struct student_s student; // declares variable
struct student_s anotherStudent; // declares variable
这两种方法实际上是等价的,但是使用第二种方法,您可以清楚地将 struct student_s
的定义与两个变量 student
和 anotherStudent
的声明分开。这更具可读性。