【问题标题】:weird operator precedence and assignment behavior in borland turboC++borland turbo C++中奇怪的运算符优先级和赋值行为
【发布时间】:2017-11-27 14:44:28
【问题描述】:

我必须在我的大学里使用borland TurboC++ 进行C 编程他们说我们的考试委员会推荐它。我必须使用它。

问题是他们给了这个运算符优先级相关的问题:

int a=10,b=20,result;
result1 = ++a + b-- - a++ * b++ + a * ++b;
printf("result=%d",);
printf("\n a=%d",a);
printf("\n b=%d",b);

gcc 等其他编译器无法执行此操作。但是turbo C 可以给我们:

result=32 a=12 b=21

我在测试中犯了错误。我的老师试图解释发生了什么。但我不相信。这是turbo C 的某种奇怪行为吗?或者在过去,所有编译器都完全没问题。如果是这样,了解正在发生的事情以及如何理解的步骤是什么。

【问题讨论】:

    标签: operators turbo-c++ turbo-c associativity


    【解决方案1】:

    为了解决这类问题,turbo-c 的方式如下:

    1) 考虑使用的变量的初始值。

    a=10
    b=20
    

    2) 计算每个变量的所有预增量和减量,并将每个变量的所有帖子单独存储在堆栈上。

    对于变量a

    pre increment = 1 therefore change the value of a to 11
    post = 1 stored to stack
    

    对于变量b

    pre increment = 1 therefore change the value of b to 21
    post = 2 stored to stack
    

    3) 现在将所有 pre 和 post 替换为 a 和 b 的当前值

    result = 11 + 21 - 11 * 21 + 11 * 21 ;
    result = 11 + 21;
    result = 32;
    

    4) 最后出栈并对变量执行操作。

    a = 12
    b = 21
    

    这是解决此问题的唯一方法。您可以检查任何同类问题的程序。结果会一样。 g++ 无法解决,因为它可能无法以相同的方式解析变量,因此出现了优先级错误。它可能会因 ++ + 和 -- - 而失败,因为它无法理解递增或递减运算符并形成模棱两可的树。

    【讨论】:

    • 谢谢拉文德。这很有帮助。将其放入堆栈并弹出它可以为问题提供视觉反馈。
    • 有人编辑了我的帖子。只有在计算了整个表达式但编辑我的帖子的人在此之前更新了它时,才会解决存储在堆栈上的帖子操作。当堆栈空间较少时,这将产生错误考虑具有 5 个空间和 6 个帖子操作替代方案的堆栈,并且 - 这种情况下堆栈将只有 5 个操作,根据我更改的帖子,它可以解决。
    猜你喜欢
    • 2013-03-27
    • 2014-12-09
    • 2015-08-24
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多