我的问题是关于以下代码行,摘自“ The C Programming Language”第二版:
*p++->str;
Run Code Online (Sandbox Code Playgroud)
该书说,这行代码在访问任何str指向后都会递增p。
我的理解如下:
优先级和关联性表示运算符的评估顺序为
后缀增量运算符++产生一个值(即其操作数的值),并且具有在下一个序列点(即以下;)之前递增此操作数的副作用。
优先级和关联性描述运算符被评估的顺序,而不是运算符的操作数被评估的顺序。
我的问题:
我的问题是关于此表达式中最高优先级运算符(->)的求值。我认为,评估此运算符意味着先评估两个操作数,然后应用该运算符。
从->运算符的角度来看,左操作数是p还是p ++?我了解这两个返回相同的值。
但是,如果第一个选项是正确的,我会问“如何评估->运算符而忽略++的存在”。
如果第二个选项是正确的,我会问“在这种情况下,是否不对->进行评估,然后要求对一个较低优先级的运算符++进行评估(并且++的评估要在->之前完成)”?
我知道该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标准的草稿中了解了常用的算术转换和整数提升。
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。
这是我期望发生的事情:
Typecast优先,的LHS -变为signed int。
-操作已执行。由于LHS和RHS都已经存在,因此这里没有整数提升或隐式转换signed int。运算结果为-1,数据类型为signed int。
在printf语句内,值-1保留在到的转换中long long int,并且-1显示为结果。
有人可以解释我的逻辑缺陷在哪里吗?
c type-conversion undefined-behavior integer-promotion implicit-conversion