( s1[i] = s2[i] ) != '\0'
不等式是否s2[i]
与'\0'
or一起检查s1[i]
?
s2[ i ]
将被分配给s1[ i ]
然后值s1[ i ]
将与零进行比较。
请参阅此处了解更多信息。
在您的语言中,它使用 进行不等式检查s1[ i ]
,但按以下顺序,
s2[i]
为to赋值s1[i]
s1[i]
with的值\0
1
或0
基于第 2 步。赋值表达式返回赋值:
表达式的值是赋值完成后左操作数的值。
所以当你有:
( 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]
”也是子表达式,并且由于未指定子表达式的求值顺序,编译器可以自由地s1[i]
在之前或之后进行求值s2[i]
。
在这种特定情况下,最有可能首先评估哪个并不重要。
在 () 子表达式中,接下来是 = 运算符。操作数的内容s2[i]
被复制到s1[i]
.
() 中的所有表达式现在都被评估,我们有一个结果,存储在s1[i]
.
最后,子表达式的这个结果是表达式的剩余运算符的一个操作数:!=
。另一个操作数是字符文字'\0'
。