为什么我的指针没有正确地取消引用我想要的输出?

时间:2014-06-16 18:51:08

标签: c pointers dereference

好的,这是我的代码:

#include <stdio.h>

void convert_weight(int x , char a,  int* y, char* b)
{
    if (a == 'F')
        *y = (x-32) * 5 / 9;
        *b = 'C';

    if(a == 'C')
        *y = x*9 / 5 + 32;
        *b = 'F';
}

int main() 
{

  int degrees1 = 50, degrees2;
  char scale1 = 'F', scale2;
  convert_weight(degrees1, scale1, &degrees2, &scale2);
  printf("%d %c = %d %c\n", degrees1, scale1, degrees2, scale2);
  degrees1 = 10;
  scale1 = 'C';
  convert_weight(degrees1, scale1, &degrees2, &scale2);
  printf("%d %c = %d %c\n", degrees1, scale1, degrees2, scale2);
  return 0;

}

这是输出:

50 F = 10 F
10 C = 50 F

请注意,我的第一行是返回10 F而不是10 C.我不太清楚为什么会这样。如果char a == 'F'那么我试图通过derefrencing将scale2设置为等于'C',就像我对于它似乎已经完美运行的度数2所做的那样。我无法在代码中看到错误导致我为两个输出获得“F”。

4 个答案:

答案 0 :(得分:5)

你缺少大括号:

void convert_weight(int x , char a,  int* y, char* b)
{
    if (a == 'F')
    {
        *y = (x-32) * 5 / 9;
        *b = 'C';
    }

    if(a == 'C')
    {
        *y = x*9 / 5 + 32;
        *b = 'F';
    }
}

如果没有大括号,*b将始终为'F'

答案 1 :(得分:4)

您在{}次测试中忘记了if()

如果没有任何{},只有if()之后的 FIRST 行成为要执行的代码:

if (a == 'F')
    *y = (x-32) * 5 / 9;   // part of the IF
    *b = 'C';              // NOT part of the IF

因此,您的*b = 'F'始终会执行,强制您始终报告F

你想要

if (a == 'F') {
    *y = (x-32) * 5 / 9;
    *b = 'C';
}

两个if()块的类型代码。

答案 2 :(得分:1)

在第一种情况下,您将传递的变量更改两次。您需要在更改后明确退出函数。

#include <stdio.h>

void convert_weight(int x , char a,  int* y, char* b)
{
    if (a == 'F') {
        *y = (x-32) * 5 / 9;
        *b = 'C';
        return;
    }

    if(a == 'C') {
        *y = x*9 / 5 + 32;
        *b = 'F';
        return;
    }
}

int main() 
{

  int degrees1 = 50, degrees2;
  char scale1 = 'F', scale2;
  convert_weight(degrees1, scale1, &degrees2, &scale2);
  printf("%d %c = %d %c\n", degrees1, scale1, degrees2, scale2);
  degrees1 = 10;
  scale1 = 'C';
  convert_weight(degrees1, scale1, &degrees2, &scale2);
  printf("%d %c = %d %c\n", degrees1, scale1, degrees2, scale2);
  return 0;

}

答案 3 :(得分:1)

你需要花括号:

void convert_weight(int x , char a,  int* y, char* b)
{
    if (a == 'F') {
        *y = (x-32) * 5 / 9;
        *b = 'C';
    }
    if(a == 'C') {
        *y = x*9 / 5 + 32;
        *b = 'F';
    }
}

因为其他只有第一个语句由if控制。