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. Что делает эта строка?

3 ответа

Решение

В соответствии с таблицей предшественников оператора, < связывает выше, чем += оператор, так что ваш код по сути

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

где (A < B) оценивается либо в 0, либо в 1 примечание, поэтому, наконец, оно сводится к

count += 0;

или же

count += 1;

Примечание: связано с1 или же 0часть, цитирующая C11, глава §6.5.8/p6, Реляционные операторы

Каждый из операторов < (меньше, чем), > (лучше чем), <= (меньше или равно) и >= (больше или равно) дает 1 если указанное отношение true а также 0 если это false,107) Результат имеет тип int,

В 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;
}

(The else часть не нужна; добавлено для пояснительной цели.)

C11 (черновик N1548.pdf), операторы отношений, §6.5.8, 6

Каждый из операторов <(меньше чем),> (больше чем), <= (меньше или равен) и>= (больше или равен) должен давать 1, если указанное отношение истинно, и 0, если оно равно ложный. 107) Результат имеет тип int.

В C есть stdbool.h заголовок, который определяет как true и false. По сути, вы можете думать о базовой реализации как:

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

true а также false определяются как не ноль и равны нулю соответственно. Так что в основном, когда last_word < (s + strlen(s) - 1)Счет увеличивается на единицу.

Другие вопросы по тегам