Является ли ba в данном случае скалярным объектом? - PullRequest
2 голосов
/ 07 мая 2020
#include <stdio.h>

int main(void) 
{
    char b[5];
    scanf("%4s%4s", b, b);
    printf("%s", b);
}

Каково точное определение скалярного объекта? Является ли b скалярным объектом в этом случае?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Согласно стандарту c11 , «типы Arithmeti c и типы указателей вместе называются скалярными типами. Типы массивов и структур вместе называются агрегатными типами»

Итак, нет, b не является скаляром, потому что это массив. Если бы это было число или указатель (например, char* b), это был бы скалярный тип.

0 голосов
/ 07 мая 2020

Цитата из ISO / IEC 9899: 2018 (C18), 6.2.5 (Типы) / 21:

" Arithmeti c типы и типы указателей все вместе называются скалярными типами. Типы массивов и структур вместе называются агрегатными типами. 47)"

47)" Обратите внимание, что агрегированный тип не включает тип объединения, поскольку объект с типом объединения может содержать только один член за раз."


" Каково точное определение скалярного объекта?"

Скалярный объект - это объект, который состоит только из одной сущности, такой как указатели и объекты арифметических c типов.

" Является b скалярным объектом в этом случае?"

b isn´ta scalar объект как скалярный объект содержит только одну единственную сущность. Такие массивы, как b, являются « агрегатами ». Распад массива на указатель в scanf("%4s%4s", b, b); и printf("%s", b); не меняет того, что b по-прежнему имеет тип массива.

...