条件运算符的执行

execution of conditional operators

int j=4;
(!j!=1)?printf("Welcome"):printf("Bye");

在上面的代码段中,根据我的说法,第一个 j!=1 将导致 true 并且 !true 是 false 这必须导致打印 Bye 但我得到 Welcome 作为输出。

谁能解释一下这个?

!j!=1(!j)!=1,而不是 !(j!=1)

这是因为 !(NOT)的 operator precedence 高于 != 所以...

j = 4; // 4
!j // 0

在您的条件下,0 != 1 为真,因此打印 "Welcome"。

对于您想要的结果,您的条件必须是 !(j!=1)

逻辑非运算符 ! 的优先级高于不等于运算符 !=

所以你的条件相当于((!j) != 1)

https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

一元运算符 '!' 的优先级高于 '!='.

阅读 - https://www.tutorialspoint.com/cprogramming/c_operators_precedence.htm.

! 首先执行,因为一元运算符 ! 的优先级高于 !=.

!4 变成 0 然后 0 != 1 变成 true.

因此,输出为 Welcome