【问题标题】:Why my code giving a wrong output? [duplicate]为什么我的代码输出错误? [复制]
【发布时间】:2015-01-07 13:16:17
【问题描述】:

我正在运行以下代码:

#include<stdio.h>
#define x 5+2

int main() {

    int p;
    p = x*x*x;
    printf("%d",p);

}

我期待343 作为输出,但答案是27。为什么这样?我无法弄清楚为什么会这样。请帮忙。

【问题讨论】:

  • #define 5+2 那是什么? x 是什么?
  • 请编译所有警告和调试信息 (gcc -Wall -Wextra -g)。编译器应该警告过你。然后学习如何使用调试器。
  • 我已经编辑了我的代码。请再次检查。对不起,错字

标签: c c-preprocessor


【解决方案1】:

这就是为什么它是 27 而不是 343:.- 之前!所以看看这个:

#include<stdio.h>
#define x 5+2

int main() {

    int p;
    p = x*x*x;  //5 + 2*5 + 2*5 + 2 -> 5 + (2*5) + (2*5) + 2 -> 5 + 10 + 10 + 2 = 27

    printf("%d",p);

    return 0;

}

您必须将其更改为:

p = (x)*(x)*(x);

或者用这一行定义它:

#define x (5+2)

所以结果是343

作为参考,请查看此处的 C 运算符先行:http://en.cppreference.com/w/c/language/operator_precedence

【讨论】:

  • 最好改成#define x (5+2)。然后在任何地方使用x 都会导致预期的结果
  • 知道了 :) 感谢您的回答 :) 您能否引用我可以了解 #define 及其运作的任何资源?
  • @Rishu 不客气!这不是一个定义的问题,它是运算符的优先级,我在我的答案中放了一个链接,以便您查看!
  • @Rizier123:谢谢!是的,我了解它的优先级。我也不了解#define,如果可能的话,你能否引用任何来源。将不胜感激:) 谢谢
  • @Rishu 一定要看看这个:cplusplus.com/doc/tutorial/preprocessor 这是关于 C 预处理器指令(包括 #define
【解决方案2】:
p = 5+2*5+2*5+2

答案:27

使用:

#define x (5+2)

【讨论】:

    【解决方案3】:

    x * x * x#define x 5 + 2 将扩展为

    p = 5 + 2 * 5 + 2 * 5 + 2
    

    因此您将拥有5 + 10 + 10 + 2 = 27,您必须添加括号

    #define x (5 + 2)
    

    然后它会扩展为

    p = (5 + 2) * (5 + 2) * (5 + 2) // -> 7 * 7 * 7 -> 343
    

    #define 没有定义变量,它定义了宏。

    您可以阅读c preprocessor 了解更多信息。

    【讨论】:

    • 没有充分的理由拒绝投票,这个答案有什么问题?
    • 我没有投票给朋友!我什至没有多少名声可以投票。虽然我想知道作为一个初学者,这个问题真的很糟糕,我得到了 2 票否决:) 无论如何感谢您的回答:)
    • @Rishu 这不是你确定的,但显然有人这样做是因为你的名声太大了,他们想摆脱它:),只是如果有什么问题这个答案我想知道。
    • @Rishu,您需要阅读有关 c 预处理器的信息,请参阅我的答案,现在我添加了一个链接。
    【解决方案4】:

    宏展开后

    p=x*x*x;  
    

    将是

    p = 5+2*5+2*5+2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2020-09-03
      • 2020-07-09
      • 1970-01-01
      相关资源
      最近更新 更多