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)
你可以打破这个:
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)
然后应该更清楚发生了什么.
正如已多次说明的那样,优先权与评估顺序无关.C语言中唯一可以影响评估顺序的是排序.优先权与它无关.
目前还不清楚你在哪里得到了" countArray[*string]--之前正在评估*string++" 的奇怪想法.这根本不可能.[]始终首先计算表达式,因为其结果是执行元素访问所必需的(即在元素访问之前排序).这意味着相反的情况:*string++之前进行评估countArray[*string]--.
所以,这里的步骤顺序是
评估*string++.该表达式的结果是原始值*string.我们来指定它tmp.
这个表达式也"安排"副作用 - 增加string.但这种增量现在不必发生.
评估countArray[tmp]--.该表达式的结果是原始值countArray[tmp].该结果立即被删除.
这个表达式也"安排"副作用 - 减少countArray[tmp].但这种减少不必立即发生.
完成对完整表达式的评估.如果上述任何副作用仍未解决,请立即完成.
例如,一个可能的评估计划可能如下所示
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)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |