小编tha*_*ude的帖子

* p ++-> str:了解->的评估

我的问题是关于以下代码行,摘自“ The C Programming Language”第二版:

*p++->str;
Run Code Online (Sandbox Code Playgroud)

该书说,这行代码在访问任何str指向后都会递增p。

我的理解如下:

  • 优先级和关联性表示运算符的评估顺序为

    1. ->
    2. ++
    3. *
  • 后缀增量运算符++产生一个值(即其操作数的值),并且具有在下一个序列点(即以下;)之前递增此操作数的副作用。

  • 优先级和关联性描述运算符被评估的顺序,而不是运算符的操作数被评估的顺序。

我的问题:

我的问题是关于此表达式中最高优先级运算符(->)的求值。我认为,评估此运算符意味着先评估两个操作数,然后应用该运算符。

从->运算符的角度来看,左操作数是p还是p ++?我了解这两个返回相同的值。

但是,如果第一个选项是正确的,我会问“如何评估->运算符而忽略++的存在”。

如果第二个选项是正确的,我会问“在这种情况下,是否不对->进行评估,然后要求对一个较低优先级的运算符++进行评估(并且++的评估要在->之前完成)”?

c side-effects operator-precedence associativity

7
推荐指数
2
解决办法
337
查看次数

编译时计算 (C++ v. C)

我知道该constexpr关键字可用于在 C++ 中执行编译时计算。例如:

constexpr int factorial(int n)
{
    return n <= 1 ? 1 : (n * factorial(n - 1));
}
Run Code Online (Sandbox Code Playgroud)

(取自https://en.cppreference.com/w/cpp/language/constexpr

能否将编译时计算视为 C++ 与 C 的主要优势?

据我了解,在 C 中不可能进行编译时计算。constexpr不可用,我认为必须在运行时评估代码。

这是 C++ 程序与等效 C 程序相比可以获得更好性能(例如速度)的一种方式吗?

c c++ metaprogramming compile-time constexpr

7
推荐指数
1
解决办法
672
查看次数

有关常规算术转换的问题-GCC编译器

我试图理解C中的隐式数据类型转换。我以为我已经理解了这个主题,但是下面的代码示例仍然让我感到困惑。

具体来说,我以前从C标准的草稿中了解了常用的算术转换和整数提升。

    unsigned short int a = 0;
    printf("\n%lld", (signed int)a - 1);
Run Code Online (Sandbox Code Playgroud)

我正在使用GCC进行编译。

unsigned short int是2个字节。 int是4个字节。

运行此代码时,将得到以下结果:4294967295

我期望结果为-1

这是我期望发生的事情:

  1. Typecast优先,的LHS -变为signed int

  2. -操作已执行。由于LHS和RHS都已经存在,因此这里没有整数提升或隐式转换signed int。运算结果为-1,数据类型为signed int

  3. printf语句内,值-1保留在到的转换中long long int,并且-1显示为结果。

有人可以解释我的逻辑缺陷在哪里吗?

c type-conversion undefined-behavior integer-promotion implicit-conversion

2
推荐指数
1
解决办法
72
查看次数