首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >arr[x++]的优先级--

arr[x++]的优先级--
EN

Stack Overflow用户
提问于 2015-08-03 22:59:41
回答 3查看 153关注 0票数 3

我对如何解析C语言中的操作优先级感到困惑。

代码语言:javascript
复制
countArray[*string++]--

正在按我想要的方式执行,但是我不理解导致countArray*string的步骤--在*string++之前被计算。

我对C语言优先级和绑定的研究没有提供与这种情况相关的答案,我想知道当与其他post/pre - crements结合使用时,post/pre-increment和post/pre-decrement的一般规则。

C怎么知道用这种方式来计算它呢?

代码语言:javascript
复制
void discountChars(char* string, char** countArray)
{
    int test;
    while(*string) {
        test = *string;

        //why is countArray[*string]-- evaluated before string++ is incremented?
        countArray[*string++]--;
        printf("countArray[%d] = %d\n", test, countArray[test]);    
    }
}
EN

回答 3

Stack Overflow用户

发布于 2015-08-03 23:04:07

你可以打破这一点:

代码语言:javascript
复制
    countArray[*string++]--;

下面是这样的:

代码语言:javascript
复制
    char index = *string;   // get char from `string` into temporary index
    string++;               // increment `string`
    countArray[index]--;    // decrement `countArray` value at given index

然后就会更清楚到底发生了什么。

票数 9
EN

Stack Overflow用户

发布于 2015-08-03 23:17:11

正如已经多次指出的那样,优先级与评估的顺序无关。在C语言中,唯一能影响计算顺序的就是排序。优先级与此无关。

也不清楚你是从哪里得到“在*string++之前评估countArray[*string]--”的奇怪想法的。这是完全不可能的。[]中的表达式总是首先计算,因为它的结果是执行元素访问所必需的(即,在元素访问之前进行排序)。这意味着相反的情况是正确的:在countArray[*string]--之前计算*string++

因此,这里的步骤顺序是

  1. 评估*string++。该表达式的结果是*string的原始值。让我们将其指定为tmp

这个表达式还“计划”了string的副作用增量。但这种增量并不是现在就必须发生的。

  1. 评估countArray[tmp]--。该表达式的结果是countArray[tmp]的原始值。此结果将立即被丢弃。

这个表达式还“计划”了countArray[tmp]的副作用递减。但这种减少并不是现在就必须发生的。

  1. 完成完整表达式的求值。如果以上任何副作用仍未解决,请立即完成。

例如,一个可能的评估计划可能如下所示

代码语言:javascript
复制
char tmp = *string; // subexpression inside `[]`
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect
string = string + 1; // side-effect

另一个可能的评估计划是

代码语言:javascript
复制
char tmp = *string; // subexpression inside `[]`
string = string + 1; // side-effect
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect

它甚至可以被评估为

代码语言:javascript
复制
string = string + 1; // side-effect
char tmp = *(string - 1); // subexpression inside `[]`
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect
票数 7
EN

Stack Overflow用户

发布于 2015-08-04 01:01:00

优先级控制运算符和操作数的分组,而不是计算顺序。

必须先计算表达式*string++,然后才能将其用作数组下标;但是,更新string的副作用可能发生在对较大的表达式进行计算之后。以下事件序列是允许的:

代码语言:javascript
复制
t1 <- *string
countArray[t1] <- countArray[t1] - 1
string <- string + 1

然后,下面的内容也是如此:

代码语言:javascript
复制
t1 <- *string
string <- string + 1
countArray[t1] <- countArray[t1] - 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31790583

复制
相关文章

相似问题

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