在另一个线程中,有人问为什么将两个ushort值相加会引起C#错误。例如
ushort x = 4;
ushort y = 23;
ushort z = x+y; // ERROR cannot implicitly convert int to ushort
Run Code Online (Sandbox Code Playgroud)
在该线程上,人们认为加号+运算符默认情况下采用两个整数,并且这是一种有助于避免算术溢出的语言功能。但是我在以下函数中遇到了相同类型的错误:
public RGB(ushort red, ushort green, ushort blue)
{
// this class RGB has three ushort fields: r, g, and b
r = red % ((ushort)256);
g = green % ((ushort)256);
b = blue % ((ushort)256);
}
Run Code Online (Sandbox Code Playgroud)
编译器出错并说“无法将类型'int'隐式转换为'ushort'。存在显式转换...”。但是,这里所说的模%运算符可以防止溢出的说法根本没有任何意义:如果x和y是ushort值,则x%y < max(x,y),因此不存在溢出为整数的风险。那我为什么会收到这个错误?
我正在努力理解C指针.作为背景,我已经习惯了在这两个编码C#和Python3.
我知道指针可用于保存变量的地址(写出类似的东西type* ptr = &var;),并且递增指针相当于递增该对象类型的对象数组的索引type.但我不明白的是你是否可以使用type(例如int)的指针和引用对象而不引用已经定义的变量.
我想不出一种方法可以做到这一点,并且大多数C/C++指针的例子似乎都使用它们来引用变量.所以我可能要问的是编码实践不可能和/或不好.如果是这样,了解原因会有所帮助.
例如,为了澄清我的困惑,如果在没有使用预定义的硬编码变量的情况下无法使用指针,为什么要使用指针而不是直接使用基本对象,或者使用对象数组?
下面有一小段代码正式描述我的问题.
非常感谢任何建议!
// Learning about pointers and C-coding techniques.
#include <stdio.h>
/* Is there a way to define the int-pointer age WITHOUT the int variable auxAge? */
int main() // no command-line params being passed
{
int auxAge = 12345;
int* age = &auxAge;
// *age is an int, and age is an int* (i.e. age is …Run Code Online (Sandbox Code Playgroud) 在下面的代码片段中(C,针对ARM嵌入式芯片)
typedef struct __attribute__((__packed__)) MyStruct_S
{
int MyFirstField;
int MySecondField;
} MyStruct_Type;
Run Code Online (Sandbox Code Playgroud)
VS Code 对属性后面的 MyStruct_S 标识符进行抱怨。投诉称“预期为 ';'C/C++(65)”。
然而,即使设置了 -Wall 和 -Wextra 编译器标志,此代码也可以正常编译和运行。
VS Code 做错了什么?我们可以修复 IntelliSence 以查看这是正确的语法吗?
我对此工作区的扩展如下:
干杯!