为什么此C程序打印3 2 15而不是2 3 20?

时间:2018-10-14 15:27:17

标签: c

tibble %>% 
  ggplot(aes(x=Res,y=Value)) +
  geom_bar(position="dodge",stat = "identity") +
  facet_wrap(~Comp)

您能解释一下该程序背后的逻辑吗?

4 个答案:

答案 0 :(得分:3)

像这样尝试(或使用调试器,或者只是在纸上帮助下进行思考)

#include <stdio.h>
int main()
{
    int a[5] = {5, 1, 15, 20, 25};
    int i, j, m;
    i = ++a[1]; fprintf(stderr, "i is %d; a[1] is %d\n", i, a[1]);
    j = a[1]++; fprintf(stderr, "j is %d; a[1] is %d\n", j, a[1]);
    m = a[i++]; fprintf(stderr, "m is %d, i is %d; a[i] is %d\n", m, i, a[i]);
    printf("%d, %d, %d", i, j, m);
}

请参见code running on ideone

答案 1 :(得分:3)

增量运算符(++)的行为根据表达式的位置而有所不同。即++foo首先递增变量foo,然后产生表达式的递增值。但是,foo++为您提供了foo的值,但是如果您想进一步使用foo,则它会增加。

因此逐行分析如下:

i = ++a[1]a[1]1,其递增值是2。因此,变量i获得值2

j = a[1]++:请记住,a[1]现在是2。因此,表达式的值为2。因此,j获得值2。但是a[1]递增,得到值3

m = a[i++]i的值为2。它是递增的,但是此处未使用该值,而是使用旧值。因此,此处正在访问a[2]。因此,m成为15

最后,i3j2,而m15

编辑:评论中指出,对++运算符的讨论并不完全是技术性的。我只是采用一种教育的方式来解释事情。 @pmg描述了注释部分中实际发生的情况。

答案 2 :(得分:0)

有两个原因。

第一位Vue.component('todo-component', { template: '#todo-component', data: function () { return { items: [ { id: 'item-1', title: 'Checkout vue', completed: false }, { id: 'item-2', title: 'Use this stuff!!', completed: false } ], newItem: '' }; }, methods: { addItem: function () { if (this.newItem) { var item = { id: Math.random(0, 10000), title: this.newItem, completed: false }; this.items.push(item); this.newItem = ''; } } } }); var app = new Vue({ el: '#vue-app' }); 修改了import axios from "axios"; ,使其等于i++

第二,后递增运算符将值增加i,但返回原始值。因此,不仅您正在修改3,而且从中获得了错误的价值。与1相同,您再次增加i,使其为j,但是运算符返回的原始值为a[1]。要返回新值,请使用预递增运算符。

这是固定代码:

2+1=3

这会给您2

答案 3 :(得分:0)

让我们逐行进行分析:

i = ++a[1];

在这里,我们首先将a[1]的值加1,然后将其分配给i

结果:a[1] == 2i == 2

j = a[1]++;

在这里,我们首先将a[1]的值分配给j,然后将a[1]的值增加1。

结果:a[1] == 3i == 2j == 2

m = a[i++];

在这里,我们首先将a[i]分配给m,然后将i增加1。

结果:a[1] == 3i == 3j == 2m = 15

这将是理解它的有用参考:https://en.cppreference.com/w/c/language/operator_precedence