Значение & st [3] -st в printf ("% ld", & st [3] -st) - PullRequest
1 голос
/ 16 июня 2019

Я новичок в C и в упражнении я должен написать вывод следующей части кода, которая является 3. Но я не мог понять, почему это так.

int main() {
    char st[100]="efgh"; 
    printf ("\n%ld\n",&st[3]-st); 
    return 0; 
}

Ответы [ 2 ]

5 голосов
/ 16 июня 2019

Когда вы используете массив в выражении, если он не является аргументом & или sizeof, он оценивается по адресу первого элемента.

Таким образом &st[3] - st оценивается как &st[3] - &st[0], который является просто арифметикой указателя: Разница между адресами двух элементов массива - это просто разница между их индексами, т.е. 3 - 0, что дает 3.

Единственная проблема заключается в том, что результаттипа ptrdiff_t, но printf %ld ожидает long int.Если эти типы отличаются на вашем компьютере, он не будет работать.В строке формата printf() правильный модификатор длины для ptrdiff_t равен t - используйте "\n%td\n".

3 голосов
/ 16 июня 2019

По определению &st[3] совпадает с st+3. st+3-st - это 3. (st в этом выражении преобразуется из массива в указатель. Для переносимости технически строка формата printf должна иметь %td вместо %ld.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...