以下两个C代码之间有什么区别

以下两个C代码之间有什么区别,c,C,我刚刚发现,如果我在文件中将x的值赋值为5,并像在下面的代码中一样运行它,那么我得到的输出是392 #include<stdio.h> #define CUBE(r) ((r)*(r)*(r)) int main() { int x; x=5; printf("%d\n", CUBE(++x)); return 1; } #包括 #定义立方体(r)((r)*(r)*(r)) int main() { int x; x=5; printf(“%d\n”

我刚刚发现,如果我在文件中将x的值赋值为5,并像在下面的代码中一样运行它,那么我得到的输出是392

#include<stdio.h>
#define CUBE(r) ((r)*(r)*(r))
int main()
{
    int x;
    x=5;
    printf("%d\n", CUBE(++x));
    return 1;
}
#包括
#定义立方体(r)((r)*(r)*(r))
int main()
{
int x;
x=5;
printf(“%d\n”,立方体(++x));
返回1;
}
但是,当我使用“scanf()”获取x的值,并为下面的代码输入5时,我得到的输出是336

#include<stdio.h>
#define CUBE(r) ((r)*(r)*(r))
int main()
{
    int x;
    scanf(" %d",&x);
    printf("y is %d\n", CUBE(++x));
    return 1;
}
#包括
#定义立方体(r)((r)*(r)*(r))
int main()
{
int x;
scanf(“%d”和&x);
printf(“y是%d\n”,立方体(++x));
返回1;
}
为什么我会得到这种输出,这两个都会给你一个答案。使用适当的功能。与多维数据集的内联函数类似,如下所示:-

inline int cube(int z) 
{ 
 return z*z*z; 
}

这是因为你所做的是未定义的,所以编译器可以自由地做它想做的事情。在没有中间序列点的情况下,不允许您多次更改变量的值,其列表可在C99或C11的附录C中找到

表达式
CUBE(++x)
的计算结果为:

((++x)*(++x)*(++x))
您得到不同结果的最可能原因是,对于
x=5
版本,编译器可以在编译时计算结果,并且可能只给您机器代码以打印出它计算的常量值

对于数据输入版本,计算最有可能留给运行时,运行时可能使用不同的计算方法

一个解决方案是不在代码中使用宏,这是我很久没有做过的事情了——我现在只在条件编译中使用宏,因为代码宏可以作为内联函数来完成,常量宏可以通过枚举来完成

换句话说,使用:

inline int cube (int r) { return r * r * r; }

这与代码宏不完全一样,因为
inline
只是一个建议(当然,函数不会出现未定义的行为)但是我现在经常发现内联建议没有什么用处,因为编译器在优化方面比以前聪明多了。

我使用的gcc compilerPrint也是
x
的值。学习使用调试器。测试
scanf
的结果。了解。使用
gcc-Wall-g
编译(使用
gdb
调试)。改进代码直到没有警告。顺便说一句,你的
cube
应该是一个内联函数
inlineintcube(intz){return z*z*z;}
在这个问题上的否决票数量有点令人伤心