Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C arr[x+;+;]的优先级--_C_Operator Precedence - Fatal编程技术网

C arr[x+;+;]的优先级--

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

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

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