首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C程序中预增量运算符的行为

C程序中预增量运算符的行为
EN

Stack Overflow用户
提问于 2012-04-26 16:33:06
回答 4查看 2.9K关注 0票数 4

我正在运行下面的C代码:

代码语言:javascript
运行
复制
#define cube(x) (x*x*x)
void main()
{   
    int x=2,y;   
    y=cube(++x);            
    printf("%d %d",++x,y);    
}

我期待的结果是

代码语言:javascript
运行
复制
6,60

但它给出了不同的结果。我想我对预处理器有误解。我认为代码将类似于

代码语言:javascript
运行
复制
void main()
{   
    int x=2,y;   
    y=++x*++x*++x;            
    printf("%d %d",++x,y);    
}

如果我错了,请纠正我。

我将结果解释为3*4*5=60

但它马上就要来了

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-26 16:36:08

您定义了一个宏,它的工作方式是简单的字符串替换,因此所显示的翻译是正确的。

然而,子表达式的执行顺序是未定义的,例如,它们可以是交错的,这使得未定义的行为

票数 5
EN

Stack Overflow用户

发布于 2012-04-26 17:23:38

预处理器采用我们给出的表达式,所以,对于你的c代码,最初是x=2,所以在执行宏的时候,

首先是两个值相乘,然后是第三个值与结果相乘,所以序列应该是,

++x * ++x => 3(第一个增量),4 (再次用于下一个增量),因此根据表达式,现在x值是4

代码语言:javascript
运行
复制
4 * 4 => 16,

对于下一个增量x => 5,根据表达式结果应该是,

代码语言:javascript
运行
复制
16 * 5 => 80

所以现在乘法的总结果是80,x值是5。

票数 -1
EN

Stack Overflow用户

发布于 2012-04-26 18:27:23

此程序的输出因编译器、操作系统甚至同一编译器的不同版本而不同,因为输出依赖于子表达式的执行顺序。

我用Visual Studio编译的: o/p是125。

当我和gcc一起编译时: o/p是80。

所以你不能预测输出。

我不知道为什么人们会在面试中问这些类型的问题(那些没有明确答案的问题)?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10329814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档