1

我正在学习 C,我正在尝试创建这个程序,它要求依次输入一个运算符(+、-、*、%)、一个数字,然后使用 scanf、printf 和 getchar()输入另一个数字。当我最后一次询问操作员时,它可以工作,但我必须先与操作员联系。

这是我想出的有效代码(但不是按顺序排列的):

char operator;
int numbers[2];
int result;

printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);
printf("Enter operation:");
getchar();
operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}

printf("%d", result);

这是没有的代码:

printf("Enter operation:");
getchar();
char operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}
printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);

printf("%d", result);

这给出了一个随机变量。

如果代码不在一个块中,请原谅我,我尽可能按照说明进行操作。

4

3 回答 3

3

赋值运算符的结果是“立即”计算的:表达式...

result = a + b;

...不会result改变其值时ab改变它们的值。

这就是为什么您的第一个片段按计划工作,而您的第二个片段显示垃圾,因为您首先尝试计算一些垃圾值的一些二进制操作的结果(numbers数组元素在分配有用的东西之前存储的内容),然后才尝试从用户那里得到一些输入。

到目前为止,该键result已经具有一定的价值,并且该值不会改变-当然,除非您进行第二次分配。)

修复这个程序很容易:只需将实际计算与输入部分分开即可。以便...

if (operator == '+') {
  result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
  result = numbers[0] - numbers[1];
}
else if (operator == '*') {
  result = numbers[0] * numbers[1];
}
else if (operator == '/') {
  result = numbers[0] / numbers[1];
}
else {
  result = 0;
}

...将遵循所有printf/scanf部分(显然,打印结果的部分除外)。顺便说一句,您可以switch用于相同的目的:

switch(operator) {
  case '+':
    result = numbers[0] + numbers[1]; break;
  case '-':
    result = numbers[0] - numbers[1]; break;
  case '*':
    result = numbers[0] * numbers[1]; break;
  case '/':
    result = numbers[0] / numbers[1]; break;
  default:
    result = 0;
}
于 2012-11-12T17:48:52.843 回答
2

在第二部分中,您尚未读取 2 个数字的值,但您正在对它们进行操作。

顺便提一句:

而不是所有

if (operation == '+') 
// etc

您可以查看 switch 语句。

switch(operator) {
   case '+'
       number[0] + number[1];
       break;
   // etc
于 2012-11-12T17:49:38.807 回答
0

看起来你有一个额外的电话getchar()

printf("Enter operation:");
getchar();
char operator = getchar();

应该

printf("Enter operation:");
char operator = getchar();

否则您可能会错过运算符,并且在进行数学运算之前您需要先阅读数字。

于 2012-11-12T17:48:26.777 回答