C语言中的奇异整数比较
我正在用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
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)
你需要理解
因此,
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在一个只使用一种运算符的表达式中,即==
,您是如何得出运算符优先级很重要的结论的?如果您查看标准或一个常见的优先级表,您肯定会发现=
运算符与=
运算符位于同一行。。。