C arr[x+;+;]的优先级--
我对如何解析C中操作的优先级感到困惑C arr[x+;+;]的优先级--,c,operator-precedence,C,Operator Precedence,我对如何解析C中操作的优先级感到困惑 countArray[*string++]-- 正在按我希望的方式执行,但我不理解导致countArray[*string]——在*string++之前进行计算的步骤 我对C优先级和绑定的研究没有提供与此案例相关的答案,我想知道与其他后/前增量和后/前减量结合使用时的一般规则 C怎么知道用这种方法来评估它 void discountChars(char* string, char** countArray) { int test; whil
countArray[*string++]--
正在按我希望的方式执行,但我不理解导致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]);
}
}
你可以打破这一点:
countArray[*string++]--;
具体到:
char index = *string; // get char from `string` into temporary index
string++; // increment `string`
countArray[index]--; // decrement `countArray` value at given index
然后应该更清楚发生了什么。正如已经多次指出的那样,优先级与评估顺序没有关系。在C语言中,唯一能影响求值顺序的是排序。优先权与此无关 还不清楚您是从何处得到这样一个奇怪的想法的:“
countArray[*string]--
是在*string++
之前被评估的”。这根本不可能。始终首先计算[]
中的表达式,因为执行元素访问需要其结果(即在元素访问之前排序)。这意味着情况正好相反:*string++
在countArray[*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
优先级控制运算符和操作数的分组,而不是计算顺序 表达式
*string++
必须先求值,然后才能用作数组下标;但是,更新字符串
的副作用可能发生在对较大的表达式求值之后。允许以下事件序列:
t1 <- *string
countArray[t1] <- countArray[t1] - 1
string <- string + 1
t1请不要这样编程。为了其他程序员和你未来的自己。这不是关于运算符优先级,而是关于求值顺序。@ParamagneticCroissant:求值顺序不是由运算符的进位和关联性决定的吗?更臭的代码垃圾,对未来的访问者没有帮助:(为什么这些垃圾日复一日地被贴出来?我投票把这个问题作为离题题来结束,因为它要求对没有人应该实际使用的垃圾代码进行解释。我不确定你为什么要使用char index
而不是int index
@WeatherVane:在这种情况下,这并没有什么区别,但是来自当值用作数组索引时,char
到int
在概念上发生。只是如果[128],我们不知道数组长度
将失败。@WeatherVane:string
属于char*
类型,因此在索引时只能返回char
。char
值可以是有符号的或无符号的(实现定义)然后它将被提升到int
。char
的隐式范围仍然适用,因此有效数组索引的限制将是0
到char\u MAX
,无论何时应用提升。@WeatherVane:是的,但无论何时进行提升,都会发生这种情况。哟当然,你可以使用强制转换,强制字符
被视为无符号
,但这不是OP的问题所在-上面答案中的代码与OP的代码行为相同,包括可能由隐式签名字符
值>127引起的任何错误。
t1 <- *string
string <- string + 1
countArray[t1] <- countArray[t1] - 1