【问题标题】:What is the execution sequence for the code below?下面代码的执行顺序是什么?
【发布时间】:2013-06-28 11:27:40
【问题描述】:
( s1[i] = s2[i] ) != '\0'

不等式检查s2[i]'\0' 还是s1[i]

【问题讨论】:

    标签: c


    【解决方案1】:

    s2[ i ] 将被分配给s1[ i ],然后s1[ i ] 的值将与零进行比较。

    refer here了解更多信息。

    【讨论】:

    • 在标准合规性方面永远不要相信 Microsoft 文档。
    【解决方案2】:

    在您的语言中,它会使用 s1[ i ] 进行不等式检查,但按照以下顺序,

    1. s2[i] 的值分配给s1[i]
    2. \0检查s1[i]的值
    3. 根据第 2 步返回 10

    【讨论】:

      【解决方案3】:

      赋值的表达式返回赋值

      表达式的值是左操作数后面的值 任务已完成。

      所以当你有:

      ( s1[ i ] = s2[ i ] ) != '\0'

      然后您将分配的值(即s1[i])与'\0' 进行比较。

      【讨论】:

        【解决方案4】:

        不等式首先进行赋值 (s1[i] = s2[i]),然后检查 s1[i] 是否不是 '\0'

        我假设是这样:

        if ((s1[i] = s2[i]) != '\0')
            ;// Do things
        

        相当于:

        s1[i] = s2[i];
        if (s1[i] != '\0')
            ;// Do things
        

        【讨论】:

          【解决方案5】:

          运算符优先级求值顺序决定了表达式的求值顺序。

          运算符优先级说明解释表达式的顺序,即哪些运算符属于哪个操作数。它类似于数学优先级,例如,1+1*2 是 3 而不是 4,因为 * 的优先级高于 +。由于该优先规则,表达式被评估为1+(1*2)

          评估顺序与优先级不同。它说明了评估子表达式的顺序。另一个数学例子:我们知道(1*1) + (1+1) 总是3。但是当我们计算它时,我们可以决定先从左括号开始,或者我们可以从右括号开始。运算符的优先级并不能决定我们从哪一个开始。虽然*的优先级高于+,但我们可以先计算右边的表达式,不会影响结果。

          但是在编程时,这种评估顺序通常很重要。编译器是决定这个顺序的人。为了使事情变得复杂,允许根据具体情况随心所欲地做,而不用记录如何做(“未指定的行为”)。


          • () 运算符具有最高优先级,因此 ( s1[i] = s2[i] ) 将首先得到评估。它里面的所有东西都是一个子表达式。

          • 在 () 子表达式中,[] 运算符具有下一个优先级,因此接下来计算两个“s[i]”。请注意,“s[i]”也是子表达式,由于没有指定子表达式的计算顺序,编译器可以在s2[i]之前或之后计算s1[i]

            在这种特定情况下,最有可能首先评估哪个并不重要。

          • 在 () 子表达式中,接下来是 = 运算符。操作数s2[i]的内容被复制到s1[i]中。

          • () 中的所有表达式现在都被计算,我们有一个结果,存储在s1[i]

          • 最后,子表达式的这个结果是表达式剩余运算符的一个操作数:!=。另一个操作数是字符文字'\0'

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-05
            • 1970-01-01
            • 2015-01-05
            • 1970-01-01
            相关资源
            最近更新 更多