【问题标题】:Logic program: increment and arithmetic operator of C [duplicate]逻辑程序:C的增量和算术运算符
【发布时间】:2017-06-30 11:15:11
【问题描述】:

谁能帮我解决这个问题

void main()
{
    int num, a=5;
    num = -a-- + + ++a;
    printf("%d %d\n", num, a);
}

回答:0 5

但是怎么做呢?谁能解释一下背后的逻辑?

【问题讨论】:

标签: c


【解决方案1】:

曾几何时,我看到两个咄咄逼人的波士顿司机试图将车停在同一个停车位上,结果他们的车实际上相撞了。这里发生了非常相似的事情。

这段代码还有其他问题,但我们只关注存储在a 中的内容。如果我们想象表达式a-- + ++a 是从左到右求值的,那么首先发生的是a-- 部分。 a 以 5 开头,所以 a-- 的值为 5,并附注将 4 存储到 a。想象一下,这张纸条被交给了第一辆车的司机。

接下来我们到达++a。暂时假设将4 存储到a 的消息尚未通过。所以++a 的值为 6,并附注将 6 存储到a。想象一下,这张纸条被交给了第二辆车的司机以供送货。

一个大问题是,num 的最终值是多少,但我现在并不担心。我们就问一下,a的最终值是多少?我们有一名汽车司机试图将其设置为 4,而一名汽车司机试图将其设置为 6。但只有一个标记为 a 的停车位。也许第一个司机先到达那里并将其设置为 4,或者可能第二个司机到达那里并将其设置为 6。或者他们可能在完全相同的时间到达那里,然后相互碰撞,a 被设置为第二辆车前保险杠上的一块扭曲的金属。 (也许那块扭曲的金属看起来有点像数字 5,所以打印 5printf 可以做到的最好的。)

正如我所说,这段代码还有其他问题。一方面,我们不应该想象它是从左到右进行评估的;根本无法保证。我们也不知道++a 部分是应该对a 的原始值还是a-- 影响的值进行操作。事实上,我们不知道这个表达式应该做什么,也许令人惊讶的事实是,编译器也不知道!不同的编译器会以不同的方式解释这样的表达式,给出截然不同的答案.没有一个答案是正确的,也没有一个是错误的,因为这个表达式是undefined

表达式未定义,因为其中有两种不同的尝试为a 分配新值。 (您会在链接的答案中找到未定义行为的更正式定义。)因此,避免未定义行为的一个简单规则是,“不要尝试在一个表达式中设置变量的值两次”。

你可能认为这个表达式应该有一个明确的解释。您可能会认为它显然应该从左到右进行评估。您可能认为a-- 应该立即将新值存储到a 中,这样就可以保证它是表达式“稍后”部分看到的值。您可能会想到这些事情,并且对于某些其他编程语言它们可能是正确的,但 C 不是。C 确实保证表达式是从左到右严格评估的,它确实 em> 保证a--++a 立即更新a 的值。尝试在一个表达式中两次更新 a 的值会导致未定义的行为,而未定义的行为意味着任何事情都可能发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2015-10-03
    • 2019-10-29
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多