C 这个程序的逻辑是什么?

C 这个程序的逻辑是什么?,c,C,我在书中遇到一个问题,它要求我编写以下程序的输出 #include<stdio.h> int main() { int j=4; ( !j != 1 ? printf("\nWelcome") : printf("GooD Bye")); return 0; } #包括 int main() { int j=4; (!j!=1?printf(“\n欢迎”):printf(“再见”); 返回0; } 我基本上无法理解运行程序时如何打印欢迎信息。有人能

我在书中遇到一个问题,它要求我编写以下程序的输出

#include<stdio.h>

int main()
{
     int j=4;
     ( !j != 1 ? printf("\nWelcome") : printf("GooD Bye"));
     return 0;
}
#包括
int main()
{
int j=4;
(!j!=1?printf(“\n欢迎”):printf(“再见”);
返回0;
}
我基本上无法理解运行程序时如何打印欢迎信息。有人能解释一下运算符的层次结构以及编译器根据表达式计算的值吗?

( !j != 1 ? printf("\nWelcome") : printf("GooD Bye")); 
相当于

if(!j != 1)
    printf("\nWelcome);
else
    printf("Good Bye");  
这里是
!j
的计算结果为
0
,因此条件
!j!=1
将始终为真,并将打印行
欢迎

( !j != 1 ? printf("\nWelcome") : printf("GooD Bye")); 
相当于

if(!j != 1)
    printf("\nWelcome);
else
    printf("Good Bye");  

这里是
!j
的计算结果为
0
,因此条件
!j!=1
将始终为真,它将打印
欢迎

是的,c的混淆

好的,用c!j的计算结果为0,因为它不是0,所以为0!=1为真,因为三元操作的真实部分被执行,并且“欢迎”被打印

因此,重新估价:

!!4=0//或任意数字


!!0=1

是的,c的混淆

好的,用c!j的计算结果为0,因为它不是0,所以为0!=1为真,因为三元操作的真实部分被执行,并且“欢迎”被打印

因此,重新估价:

!!4=0//或任意数字



!!0=1

谢谢你这样解释,我在比较部分感到困惑:ko:Lol,这不是问题,但我肯定我需要50次重复才能对其他人的问题发表评论-u-尽管有50次声誉,但我的帐户中没有添加一次声誉(除了接受答案的
15
)为什么你需要更多的重复:PLong故事!我想成为像……这样的人(程序员)。。。。。。还有很多,让它去吧。谢谢你这样解释,我在比较部分感到困惑:ko:Lol,这不是问题,但我肯定我需要50次重复才能对其他人的问题添加评论-尽管有50次声誉,但我的帐户中没有添加一次声誉(除了接受答案的
15
)你为什么需要更多的重复:砰砰的一声!我想成为像……更多的人(程序员),让它去吧。你的答案很感激,伙计:)我在治疗(!j!=1)作为两个不同的实体,而不是制造混乱的实体:|是的,比较可能真的很混乱。你的答案很好,伙计:)我把(!j!=1)当作两个不同的实体,而不是制造混乱的实体:|是的,比较可能真的很混乱。首先看!J这个反转真/假值。在本例中,TRUE是任何非零的值(即4),FALSE是0。所以j和!计算结果为FALSE(或0)的4。0 != 1的计算结果为TRUE,因此执行速记if/else的第一部分,即“欢迎”部分。逻辑NOT运算符!,将非零整数转换为零,并将零转换为一些非零整数,通常为1,但如果出现-1,请不要感到惊讶。这是Forth在标准化过程中面临的难题。逻辑不是全部零位、全部一位还是单个一位?我认为ANS第四委员会永远无法解决这个问题,NOT在规范中没有定义(遗憾的是)。@Briantifin-所以我有时可能会遇到逻辑NOT运算符可能返回(-1)的情况?看起来我还需要在我使用逻辑NOT编写的一些程序中添加一个例子。@PranavJituri-理论上有点模糊,但在大多数实际应用中,应该是1。如果你真的想得到技术上的正确,屏蔽掉最后一位并测试它<代码>n和1通常就足够了。请注意,我不符合当前的C标准,希望有人有勇气编写
!0
返回。编译器怪癖安全的一种方法是将TRUE定义为!0,并让编译器实现担心这是什么值,这(希望)是内部一致的。@PranavJituri@brifin。我已经听说过这一点,所以可能有编译器的结果是一元
而不是
0
1
。但K&R、C89、C99和C11对此很清楚:结果总是
0
1
。(对于C99,C11:§6.5.3.3(5))首先看!J这个反转真/假值。在本例中,TRUE是任何非零的值(即4),FALSE是0。所以j和!计算结果为FALSE(或0)的4。0 != 1的计算结果为TRUE,因此执行速记if/else的第一部分,即“欢迎”部分。逻辑NOT运算符!,将非零整数转换为零,并将零转换为一些非零整数,通常为1,但如果出现-1,请不要感到惊讶。这是Forth在标准化过程中面临的难题。逻辑不是全部零位、全部一位还是单个一位?我认为ANS第四委员会永远无法解决这个问题,NOT在规范中没有定义(遗憾的是)。@Briantifin-所以我有时可能会遇到逻辑NOT运算符可能返回(-1)的情况?看起来我还需要在我使用逻辑NOT编写的一些程序中添加一个例子。@PranavJituri-理论上有点模糊,但在大多数实际应用中,应该是1。如果你真的想得到技术上的正确,屏蔽掉最后一位并测试它<代码>n和1通常就足够了。请注意,我不符合当前的C标准,希望有人有勇气编写
!0
返回。编译器怪癖安全的一种方法是将TRUE定义为!0,并让编译器实现担心这是什么值,这(希望)是内部一致的。@PranavJituri@brifin。我已经听说了,所以也许