我读了一些代码,发现了这个相当神秘的语法:
size_t count = 1;
char *s = "hello you";
char *last_word = "there";
count += last_word < (s + strlen(s) - 1); #line of interest
不知何故,计数增加了。但我认为 < 运算符会返回 true 或 false。这条线有什么作用?
我读了一些代码,发现了这个相当神秘的语法:
size_t count = 1;
char *s = "hello you";
char *last_word = "there";
count += last_word < (s + strlen(s) - 1); #line of interest
不知何故,计数增加了。但我认为 < 运算符会返回 true 或 false。这条线有什么作用?
根据运算符优先级表,<
绑定高于+=
运算符,因此您的代码本质上是
count += ( last_word < (s + strlen(s) - 1)) ;
其中,(A < B)
计算结果为 0 或 1 Note,因此,最后,它减少到
count += 0;
或者
count += 1;
注意:与“1
或0
”部分相关,引用C11
,第 §6.5.8/p6 章,关系运算符
如果指定的关系是且如果 是 ,则每个运算符
<
(小于)、>
(大于)、<=
(小于或等于)和>=
(大于或等于)都应产生。107)结果类型为。1
true
0
false
int
在 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。
在 C 中,有一个stdbool.h
标题定义为真假。本质上,您可以将基本实现视为:
#define bool int
#define true 1
#define false 0
true
和false
分别定义为不为零和等于零。所以基本上当last_word < (s + strlen(s) - 1)
, count 加一。