2

я прочитал код и подошел этот довольно загадочный синтаксис:c: Что делает эта линия?

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

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

Count увеличивается, так или иначе. Но я думал, что оператор < вернет true или false. Что делает эта линия?

+2

'last_word <(S + StrLen (ы) - 1);' принимает значение 1 или 0 (истина или ложь) – Linus

+0

см [здесь] (http://stackoverflow.com/questions/2725044/can -i-accept-booltrue-int1-for-any-c-компилятор) для некоторого обсуждения о литье boolean to int –

+0

@EuanSmith, как это уместно здесь? реляционные операторы возвращают результат типа 'int'. Откуда берётся логическое изображение? –

ответ

5

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

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.

0

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

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

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

+0

Сюрприз !! C имеет значение boolean. –

+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 части Излишне; добавлена ​​для пояснительной цели)

С11 (проект N1548.pdf), операторы отношения, §6.5.8, 6

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