arr的优先权[x ++] -

new*_*ent 3 c operator-precedence

我很困惑如何解析C.行中的操作优先级

countArray[*string++]--
Run Code Online (Sandbox Code Playgroud)

正在执行我想要的方式,但我不理解导致countArray [*string]的步骤 - 在*string ++之前进行评估.

我对C优先级和绑定的研究没有提供与这种情况相关的答案,而且我想知道关于后期/预增量和后期/预先减少的一般规则,当与其他帖子/预先创建相结合时.

C如何知道以这种方式评估它?

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]);    
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 9

你可以打破这个:

    countArray[*string++]--;
Run Code Online (Sandbox Code Playgroud)

到这个:

    char index = *string;   // get char from `string` into temporary index
    string++;               // increment `string`
    countArray[index]--;    // decrement `countArray` value at given index
Run Code Online (Sandbox Code Playgroud)

然后应该更清楚发生了什么.

  • @WeatherVane:它在这个实例中没有任何区别,但是当`value用作数组索引时,从`char`到`int`的升级在概念上发生. (2认同)

AnT*_*AnT 7

正如已多次说明的那样,优先权与评估顺序无关.C语言中唯一可以影响评估顺序的是排序.优先权与它无关.

目前还不清楚你在哪里得到了" countArray[*string]--之前正在评估*string++" 的奇怪想法.这根本不可能.[]始终首先计算表达式,因为其结果是执行元素访问所必需的(即在元素访问之前排序).这意味着相反的情况:*string++之前进行评估countArray[*string]--.

所以,这里的步骤顺序是

  1. 评估*string++.该表达式的结果是原始值*string.我们来指定它tmp.

    这个表达式也"安排"副作用 - 增加string.但这种增量现在不必发生.

  2. 评估countArray[tmp]--.该表达式的结果是原始值countArray[tmp].该结果立即被删除.

    这个表达式也"安排"副作用 - 减少countArray[tmp].但这种减少不必立即发生.

  3. 完成对完整表达式的评估.如果上述任何副作用仍未解决,请立即完成.

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

char tmp = *string; // subexpression inside `[]`
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect
string = string + 1; // side-effect
Run Code Online (Sandbox Code Playgroud)

另一种可能的评估计划是

char tmp = *string; // subexpression inside `[]`
string = string + 1; // side-effect
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect
Run Code Online (Sandbox Code Playgroud)

它甚至可以评估为

string = string + 1; // side-effect
char tmp = *(string - 1); // subexpression inside `[]`
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect
Run Code Online (Sandbox Code Playgroud)