我对如何解析C语言中的操作优先级感到困惑。
countArray[*string++]--正在按我想要的方式执行,但是我不理解导致countArray*string的步骤--在*string++之前被计算。
我对C语言优先级和绑定的研究没有提供与这种情况相关的答案,我想知道当与其他post/pre - crements结合使用时,post/pre-increment和post/pre-decrement的一般规则。
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]);
}
}发布于 2015-08-03 23:04:07
你可以打破这一点:
countArray[*string++]--;下面是这样的:
char index = *string; // get char from `string` into temporary index
string++; // increment `string`
countArray[index]--; // decrement `countArray` value at given index然后就会更清楚到底发生了什么。
发布于 2015-08-03 23:17:11
正如已经多次指出的那样,优先级与评估的顺序无关。在C语言中,唯一能影响计算顺序的就是排序。优先级与此无关。
也不清楚你是从哪里得到“在*string++之前评估countArray[*string]--”的奇怪想法的。这是完全不可能的。[]中的表达式总是首先计算,因为它的结果是执行元素访问所必需的(即,在元素访问之前进行排序)。这意味着相反的情况是正确的:在countArray[*string]--之前计算*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另一个可能的评估计划是
char tmp = *string; // subexpression inside `[]`
string = string + 1; // side-effect
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect它甚至可以被评估为
string = string + 1; // side-effect
char tmp = *(string - 1); // subexpression inside `[]`
countArray[tmp]; // full expression, result discarded
countArray[tmp] = countArray[tmp] - 1; // side-effect发布于 2015-08-04 01:01:00
优先级控制运算符和操作数的分组,而不是计算顺序。
必须先计算表达式*string++,然后才能将其用作数组下标;但是,更新string的副作用可能发生在对较大的表达式进行计算之后。以下事件序列是允许的:
t1 <- *string
countArray[t1] <- countArray[t1] - 1
string <- string + 1然后,下面的内容也是如此:
t1 <- *string
string <- string + 1
countArray[t1] <- countArray[t1] - 1https://stackoverflow.com/questions/31790583
复制相似问题