【发布时间】:2013-06-28 11:27:40
【问题描述】:
( s1[i] = s2[i] ) != '\0'
不等式检查s2[i] 与'\0' 还是s1[i]?
【问题讨论】:
标签: c
( s1[i] = s2[i] ) != '\0'
不等式检查s2[i] 与'\0' 还是s1[i]?
【问题讨论】:
标签: c
s2[ i ] 将被分配给s1[ i ],然后s1[ i ] 的值将与零进行比较。
请refer here了解更多信息。
【讨论】:
在您的语言中,它会使用 s1[ i ] 进行不等式检查,但按照以下顺序,
s2[i] 的值分配给s1[i]
\0检查s1[i]的值
1 或 0。【讨论】:
赋值的表达式返回赋值:
表达式的值是左操作数后面的值 任务已完成。
所以当你有:
( s1[ i ] = s2[ i ] ) != '\0'
然后您将分配的值(即s1[i])与'\0' 进行比较。
【讨论】:
不等式首先进行赋值 (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
【讨论】:
运算符优先级和求值顺序决定了表达式的求值顺序。
运算符优先级说明解释表达式的顺序,即哪些运算符属于哪个操作数。它类似于数学优先级,例如,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'。
【讨论】: