Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我第一个节目的几个小问题_C - Fatal编程技术网

C 我第一个节目的几个小问题

C 我第一个节目的几个小问题,c,C,所以我是c的新手,我的第一个课程有几个问题。我写了一个程序,返回两个数字的和、差、积、除和提醒 #include <stdio.h> int main(void) { int a, b, c, d, f, h, g; c = a + b; d = a - b; f = a * b; h = a / b; g = a % b; printf("Enter two numbers:"); scanf("%d %d\n",&a,&b);

所以我是c的新手,我的第一个课程有几个问题。我写了一个程序,返回两个数字的和、差、积、除和提醒

#include <stdio.h>

int main(void) {
  int a, b, c, d, f, h, g;
  c = a + b;
  d = a - b;
  f = a * b;
  h = a / b;
  g = a % b;

  printf("Enter two numbers:");
  scanf("%d %d\n",&a,&b);
  printf("%d\n",c);
  printf("%d\n",d);
  printf("%d\n",f);
  if (b != 0 ) {
  printf("%d\n",h);
  printf("%d\n",g);
  }
}

如果不是我写的,编译器会告诉我参数是int*但参数的类型是int。什么是int*

我还注意到,如果我没有,但scanf编译器将显示仍然是数字,这是怎么回事

32766
-32766
0
0
0

程序将按照任务的编写顺序执行任务

在使用a和b进行计算之前,只需询问它们的值

#include <stdio.h>

int main(void) {
  int a, b, c, d, f, h, g;

  printf("Enter two numbers:");
  scanf("%d %d\n",&a,&b);

  c = a + b;
  d = a - b;
  f = a * b;
  h = a / b;
  g = a % b;

  printf("%d\n",c);
  printf("%d\n",d);
  printf("%d\n",f);
  if (b != 0 ) {
  printf("%d\n",h);
  printf("%d\n",g);
  }
}
在内存中创建一个整数变量,n是它的引用名。 您可以使用&n查找存储该整数的内存地址

创建指向内存位置的指针,指针名称为n。它不创建整数变量

因此,您可以:

int a;
int *p;

p=&a; /* Set pointer to be the address of the variable a in memory */

a = 5;  /* Set a value for a */

printf("a = %d\n", a);   /* show a */
printf("a = %d\n", *p);  /* Show the contents at address p */

printf("p = %p\n", p);   /* show p */
printf("p = %p\n", &a);  /* show the memory address where a is stored */

程序将按照任务的编写顺序执行任务

在使用a和b进行计算之前,只需询问它们的值

#include <stdio.h>

int main(void) {
  int a, b, c, d, f, h, g;

  printf("Enter two numbers:");
  scanf("%d %d\n",&a,&b);

  c = a + b;
  d = a - b;
  f = a * b;
  h = a / b;
  g = a % b;

  printf("%d\n",c);
  printf("%d\n",d);
  printf("%d\n",f);
  if (b != 0 ) {
  printf("%d\n",h);
  printf("%d\n",g);
  }
}
在内存中创建一个整数变量,n是它的引用名。 您可以使用&n查找存储该整数的内存地址

创建指向内存位置的指针,指针名称为n。它不创建整数变量

因此,您可以:

int a;
int *p;

p=&a; /* Set pointer to be the address of the variable a in memory */

a = 5;  /* Set a value for a */

printf("a = %d\n", a);   /* show a */
printf("a = %d\n", *p);  /* Show the contents at address p */

printf("p = %p\n", p);   /* show p */
printf("p = %p\n", &a);  /* show the memory address where a is stored */
请阅读指针C是一种指针语言

&表示存储中数据类型的地址

*表示存储中数据类型的值

这方面的一个很好的例子是这段代码:

double x, *y;
x = 5.0;
y = &x;
*y = -3.0;
现在x的值是-3.0,因为y是x的地址,*y改变了x的地址值。

请阅读指针C是指针语言

&表示存储中数据类型的地址

*表示存储中数据类型的值

这方面的一个很好的例子是这段代码:

double x, *y;
x = 5.0;
y = &x;
*y = -3.0;

现在x的值为-3.0,因为y是x的地址,*y改变了x的地址值。

因此出于某种原因,编译器显示第一句话,输入两个数字,然后什么也不做:

printf…:将消息打印到屏幕上

scanf…:将停止程序并等待您的输入。这意味着您 应分别输入a和b的值

&:它表示变量a或b的地址,因为您的程序将在内存中存储数据,这意味着您需要在内存中指定存储a和b值的地址。 如果不使用&将生成此错误:参数为int*但参数的类型为int。这是因为'a'是变量的值,它的类型为int,但'&a'是变量的地址,它的类型为int更多关于它的信息,当您使用c中的指针时,您可以检查这一点。你需要知道的是,scanf将采用&a而不是a

如果不使用scanf,为什么会得到这些随机值?
它们被称为垃圾值更多的是关于它的

,因此出于某种原因,编译器显示第一句话,输入两个数字,然后什么也不做:

printf…:将消息打印到屏幕上

scanf…:将停止程序并等待您的输入。这意味着您 应分别输入a和b的值

&:它表示变量a或b的地址,因为您的程序将在内存中存储数据,这意味着您需要在内存中指定存储a和b值的地址。 如果不使用&将生成此错误:参数为int*但参数的类型为int。这是因为'a'是变量的值,它的类型为int,但'&a'是变量的地址,它的类型为int更多关于它的信息,当您使用c中的指针时,您可以检查这一点。你需要知道的是,scanf将采用&a而不是a

如果不使用scanf,为什么会得到这些随机值?
它们被称为垃圾值,关于它的更多信息

H应该是float,您应该强制转换division@AlbertoSinigagliaint h在这里可以表示整除。如果需要浮点商,则使用双重数学和不强制转换更好。双H=1.0*a/b;。强制转换倾向于隐藏问题,double是C的默认FP类型。它是这样的:如果b!=0{为true,则此:h=a/b;将导致程序崩溃,因为除以0H应为float,并且应强制转换division@AlbertoSinigagliaint h在这里可以用来表示整数除法。如果需要浮点商,则使用双精度数学和不强制转换更好。双精度h=1.0*a/b;。强制转换倾向于隐藏问题,double是C的默认FP类型。它是这样的:如果b!=0{为真,那么:h=a/b;将导致程序崩溃,因为除以0&a意味着a的位置。您告诉scanf在哪里可以找到a,以便它可以写入a。另外,int*表示指向int的指针。如果变量是i类型的
nt*,它可以将位置保存为int。因此,基本上,您可以编写int*pointsToA=&a;,然后使用该点stoa间接修改a的内容:c=a+b;d=a-b;f=a*b;h=a/b;g=a%b;因为变量a和变量b还没有初始化,所以编译器应该告诉您这个问题,所以在发布的程序中有很多未定义的行为。强烈建议在调用scanf.OT:about:scanf%d%d\n,&a,&b;之后将这些语句移动到;1始终检查返回值而不是参数值,以确保操作成功。注意:scanf系列函数返回成功的“输入格式说明符”数。在当前语句中,除2之外的任何返回值都表示发生了错误。2不要将“\n”放在字符串格式的末尾这些值在输出中:32766-32766是堆栈上变量a和b所在的垃圾桶&a表示a的位置。您正在告诉scanf在哪里可以找到a,以便它可以向a写入。此外,int*表示指向int的指针。如果变量的类型为int*,它可以将位置保存到int。因此,基本上,您可以编写int*pointsToA=&a;,然后使用该点stoa间接修改a的内容:c=a+b;d=a-b;f=a*b;h=a/b;g=a%b;因为变量a和变量b还没有初始化,所以编译器应该告诉您这个问题,所以在发布的程序中有很多未定义的行为。强烈建议在调用scanf.OT:about:scanf%d%d\n,&a,&b;之后将这些语句移动到;1始终检查返回值而不是参数值,以确保操作成功。注意:scanf系列函数返回成功的“输入格式说明符”数。在当前语句中,除2之外的任何返回值都表示发生了错误。2不要将“\n”放在字符串格式的末尾。这些值在输出中:32766-32766是堆栈上变量a和b所在位置的垃圾。了解指针的工作方式对于理解如何用C编程至关重要。我强烈建议您按照此答案中的建议阅读它们,然后玩指针,直到你对它们的用法有信心为止;y=&x;y的声明应该是:*y,因为它将包含指向double的指针而不是double的指针了解指针的工作原理对于理解如何用C编程至关重要。我强烈建议您按照本答案中的建议阅读它们,然后玩指针,直到你对它们的用法有信心为止;y=&x;y的声明应该是:*y,因为它将包含指向double而不是double的指针