2

我读了一些代码,发现了这个相当神秘的语法:

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

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

不知何故,计数增加了。但我认为 < 运算符会返回 true 或 false。这条线有什么作用?

4

3 回答 3

5

根据运算符优先级表,<绑定高于+=运算符,因此您的代码本质上是

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

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

count += 0;

或者

count += 1;

注意:与“10”部分相关,引用C11,第 §6.5.8/p6 章,关系运算符

如果指定的关系是且如果 是 ,则每个运算符<(小于)、>(大于)、<=(小于或等于)和>= (大于或等于)都应产生。107)结果类型为。1true0falseint

于 2016-09-21T08:17:52.140 回答
1

在 C 中,关系运算符总是产生 0 或 1。所以,这个语句

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

count根据比较的结果添加 0 或 1 。它可以写成(和等价于):

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。

于 2016-09-21T08:24:49.963 回答
0

在 C 中,有一个stdbool.h标题定义为真假。本质上,您可以将基本实现视为:

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

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

于 2016-09-21T08:19:00.913 回答