C语言中的奇异整数比较

C语言中的奇异整数比较,c,comparison,boolean,C,Comparison,Boolean,我正在用C编写简单的程序,我不明白为什么: printf("%d\n", 1 == 1 == 1); printf("%d\n", 1 == 1); printf("%d\n", 0 == 0 == 0); printf("%d\n", 0 == 0); 给出: 1 1 0 1 我已经习惯了Python,所以所有这些对我来说都是新的和陌生的 (作为旁白,谁是发明者?) 我认为C代表外星人,而不是人类 也许吧。没有人会把代码写成1==1==1 不管怎样,这里发生了什么。表达式被解析为(1==1

我正在用C编写简单的程序,我不明白为什么:

printf("%d\n", 1 == 1 == 1);
printf("%d\n", 1 == 1);
printf("%d\n", 0 == 0 == 0);
printf("%d\n", 0 == 0);
给出:

1
1
0
1
我已经习惯了Python,所以所有这些对我来说都是新的和陌生的

(作为旁白,谁是发明者?)

我认为C代表外星人,而不是人类

也许吧。没有人会把代码写成
1==1==1

不管怎样,这里发生了什么。表达式被解析为
(1==1)==1
,因此它是与1的另一个比较结果的比较。真值在C中表示为整数;true为1,false为0。所以
1==1
是1(真),等于1

0==0==0
类似:

(0 == 0) == 0
1 == 0 // 0 == 0 is true (1)
0 // 1 == 0 is false (0)

你需要理解

  • 运算符优先级(http://www.swansontec.com/sopc.html)
  • < L> C++中的C/C++ 0等价于FALSE,任何非零整数都等于true。
  • bool类型可以隐式转换为整数,0转换为false,1转换为true

  • 因此,
    1==1==1
    被评估为
    (1==1)==1
    -->
    true==1
    -->
    true
    。从何处
    printf(“%d\n”,1==1==1)
    -->
    printf(“%d\n”,true)
    -->
    printf(“%d\n”,int)true)
    -->
    printf(“%d\n”,1)
    -->
    1

    如果两个操作数具有相同的值,则
    =
    运算符的结果为
    1
    ,如果两个值不同,则为
    0

    除了括号中的表达式外,这里没有什么奇怪的。编程的第一定律-将问题(在本例中是表达式)分解为足够小的位,以便您理解。这只是一个测试。我想检查a==b==true(1)。我是一个人。。。我认为,@Lundin你混淆了优先的句法概念和计算顺序的动态概念。
    1==1==1
    的关联性由C99 6.5.9:1等完美定义。不涉及未定义的行为。@Lundin这里是使用C99 6.5.9:1语法对AST
    (1==1)==1
    的派生。E→ E==R→ (E==R)==R。你如何以与该语法兼容的方式派生
    1==(1==1)
    ?PS:是的,你说的是“未指定”,这确实很不一样,对不起。@Lundin在6.5:3的同一页上,作为脚注72的一部分,有这样一句话:“在每个主要子类中,运算符具有相同的优先级。在每个子类中,左或右关联性由其中讨论的表达式的语法表示。”@Lundin语法通过只允许从具体语法派生AST
    (1==1)==1
    来指示运算符的左或右关联性。请阅读脚注72。或者,如果对您更有说服力的话,尝试导出
    1==(1==1)
    ,但失败。操作员在场与此问题无关。1==1==1可以计算为
    (1==1)==1
    1==(1==1)
    ,您无法知道这适用于哪种情况。这被称为“评估顺序”,适用的是未指定的行为。@Lundin很抱歉重复我的话,但你有相反的解释。这个例子完全与优先级有关,与求值顺序无关。@composedSeebio在一个只使用一种运算符的表达式中,即
    ==
    ,您是如何得出运算符优先级很重要的结论的?如果您查看标准或一个常见的优先级表,您肯定会发现
    =
    运算符与
    =
    运算符位于同一行。。。