【问题标题】:Is b a scalar object in this case?在这种情况下 b 是标量对象吗?
【发布时间】:2020-08-22 09:28:57
【问题描述】:
#include <stdio.h>

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

标量对象的确切定义是什么? b 在这种情况下是标量对象吗?

【问题讨论】:

  • @Ed Heal 但是b 不是指向基地址的指针吗?
  • 在这种情况下,b 是一个数组,而不仅仅是一个指针。如果它被声明为char* b,它将是一个常规指针
  • @Daniel Giger 谢谢。
  • C11 标准是n1570。请仔细阅读

标签: c arrays object pointers scalar


【解决方案1】:

根据c11 standard,“算术类型和指针类型统称为标量类型。数组和结构类型统称为聚合类型”

所以不,b 不是标量,因为它是一个数组。如果它是一个数字或一个指针(如char* b),它将是一个标量类型。

【讨论】:

    【解决方案2】:

    引自 ISO/IEC 9899:2018 (C18), 6.2.5 (Types)/21:

    "算术类型和指针类型统称为标量类型。数组和结构类型统称为聚合类型。47)"

    47) "请注意,聚合类型不包括联合类型,因为联合类型的对象一次只能包含一个成员。"


    "标量对象的确切定义是什么?"

    标量对象是仅由单个实体组成的对象,例如指针和算术类型的对象。

    b 在这种情况下是一个标量对象吗?

    b 不是 标量 对象,因为标量对象仅包含一个实体。 b 等数组是“聚合”。 scanf("%4s%4s", b, b);printf("%s", b); 中指向指针衰减的数组不会改变 b 仍然是数组类型。

    【讨论】:

    • "如果 标量对象 上的副作用相对于同一标量对象上的另一个副作用未排序,则行为未定义。" — 所以这不适用于scanf("%4s%4s", b, b); 语句的情况,因为b 不是标量对象,对吧?
    • @NirajRaut 完全正确。
    • 支持 Monica Celio 谢谢。
    • @NirajRaut 您不能以 char 表示法打印负 ASCII 代码,因为没有。所有 ASCII 值都是正数。 -> stackoverflow.com/questions/4690415/negative-ascii-value 你想用这个语句达到什么目的?
    • @NirajRaut 神奇之处在于EOF。它不是一个字符,而是一个表示函数返回错误的符号。 - 为了将错误与常见字符区分开来,它必须是负值。 EOF 的确切负值是实现定义的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2021-10-04
    • 2023-01-31
    • 1970-01-01
    • 2017-02-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多