2

我读了一些代码,然后走了过来,而这个神秘的语法:c:这条线是做什么的?

size_t count = 1; 
char *s   = "hello you"; 
char *last_word = "there"; 

count += last_word < (s + strlen(s) - 1); #line of interest 

计数递增,不知何故。但我认为<运算符会返回true或false。 这条线是做什么的?

+2

'last_word <(s + strlen(s)-1);'计算结果为1或0(true或false) – Linus

+0

请参阅[here](http://stackoverflow.com/questions/2725044/can -i-assume-booltrue-int1-for-any-c-compiler)关于将布尔转换为int的一些讨论 –

+0

@EuanSmith这里的相关内容如何?关系运算符返回类型为“int”的结果。从哪里布尔进入图片? –

回答

5

作为每operator precedance表,<结合高于+=操作者,所以代码基本上是

count += (last_word < (s + strlen(s) - 1)) ; 

其中,所述(A < B)的计算结果为0或1 ,因此,最后,它减少到

count += 0; 

count += 1; 

注:相关的 “10” 的一部分,报价C11,章§6.5.8/ P6,关系运算符

每个运营商<的(小于), (大于),<=(小于或等于)和>= (大于或等于)将产生1如果指定的关系是true0如果它是 false107)结果的类型为int

0

在C中有一个stdbool.h标题,它定义为true和false。基本上你能想到的基本implemantation为:

#define bool int 
#define true 1 
#define false 0 

truefalse被定义为不为零,等于分别为零。所以基本上当last_word < (s + strlen(s) - 1)时,count加1。

+0

惊喜! C有布尔值。 –

+0

@SouravGhosh你是指'stdbool'头? – Linus

+0

是的,绝对。 :) –

1

在C,关系运算符根据比较的结果总是产生0或1。所以,这种说法

count += last_word < (s + strlen(s) - 1); 

增加0或1至count。它可写为(和等同于):

if (last_word < (s + strlen(s) - 1)) { 
    count = count + 1; 
} else { 
    count = count + 0; 
} 

(该else部分不用;添加用于说明目的)

C11(N1548.pdf草案),关系运算符,§6.5。8,6

每个运营商<(小于),>(大于)的,< =(小于 或等于),和> =(大于或等于)应得到1-如果 指定的关系为真,如果它为假,则为0。 107)结果有 int类型。