相关疑难解决方法(0)

103
推荐指数
5
解决办法
8万
查看次数

箭头操作员与点操作员

在我看来,C的箭头操作符( - >)是不必要的.点运算符(.)应该足够了.请使用以下代码:

typedef struct {
    int member;
} my_type;

my_type   foo;
my_type * bar;
int       val;

val = foo.member;
val = bar->member;
Run Code Online (Sandbox Code Playgroud)

我们看到箭头操作符必须用于取消引用栏.但是,我更愿意写

val = bar.member;
Run Code Online (Sandbox Code Playgroud)

关于我是否试图从结构或指针结构中拉出"成员",没有任何歧义.但是使用错误的运算符很容易,尤其是在重构代码时.(例如,也许我正在foo上做一些复杂的操作,所以我将代码移动到一个新函数并将指针传递给foo).我认为我不需要关心foo是否是指针; 编译器可以担心细节.

所以问题是:从C语言中消除 - >不是更简单吗?

c pointers structure

35
推荐指数
2
解决办法
5万
查看次数

为什么左侧的"取消引用"和"运营商地址"?

在C(以及一些其他类C语言)中,我们有2个一元运算符用于处理指针:dereference运算符(*)和'address of'运算符(&).他们留下一元运算符,它引入了一个不确定性的操作顺序,例如:

*ptr->field
Run Code Online (Sandbox Code Playgroud)

要么

*arr[id]
Run Code Online (Sandbox Code Playgroud)

操作的顺序严格标准定义的,而是从一个人的角度来看,这是令人困惑的.如果*操作员是一个正确的一元操作员,那么订单将是显而易见的,并且不需要额外的括号:

ptr*->field vs ptr->field*
Run Code Online (Sandbox Code Playgroud)

arr*[id] vs arr[id]*
Run Code Online (Sandbox Code Playgroud)

因此,运营商为什么要保持一元而不是正确,这是有充分理由的.想到的一件事是类型的声明.左运营附近逗留类型名称(char *aVS char a*),但也有类型声明,这已经打破了这一规则,何必(char a[num],char (*a)(char),等).

显然,这种方法也有一些问题,比如

 val*=2
Run Code Online (Sandbox Code Playgroud)

这将是一个*=简短的手val = val * 2或取消引用和分配val* = 2.然而,这可以通过在解除引用的情况下在令牌*=令牌之间需要空白空间来容易地解决.再一次,没有任何开创性的,因为有这样一个规则的先例(- -avs --a).

那么为什么他们离开而不是正确的运营商?

编辑:我想指出,我问过这个问题,因为C的许多怪问题都有有趣的解释,为什么它们是这样的,就像运算符存在->或类型声明或索引从等等.原因可能不再有效,但我认为它们仍然很有趣.

c syntax pointers operator-precedence dereference

5
推荐指数
1
解决办法
337
查看次数

为什么我应该使用“->”而不是“.” 在对象的指针中?

我同意这可能是一个非常初学者的问题,但我不知道为什么我不能使用“。” 访问对象指针的成员。

\n

例如

\n
JMP *sum_obj = new JMP("0");\nJMP a;\nsum_obj->number;\na.number;\n\nsum_obj.number; // error: request for member \xe2\x80\x98number\xe2\x80\x99 in \xe2\x80\x98sum_obj\xe2\x80\x99, which is of pointer type \xe2\x80\x98JMP*\xe2\x80\x99 (maybe you meant to use \xe2\x80\x98->\xe2\x80\x99 ?)\n
Run Code Online (Sandbox Code Playgroud)\n

这里,为什么要使用->会员sum_obj number呢?

\n

c++ pointers dot-operator

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

默认情况下,C可以通过指针传递

C是一种古老的语言.例如,你知道使用它没有问题吗?运算符而不是带有指针的 - >运算符,并且由于遗留原因而维护了 - >?看到这里.

研究几个C代码,可以注意到大多数时间结构是使用指针而不是值传递的.数组也通过指针传递.

是否可以更改语法以默认将结构作为指针传递?例如,请考虑以下示例:

struct Point {
    float x;
    float y;
};

struct Line {
    Point! p0; // ! means that we want a value, not a pointer
    Point! p1;
};

struct Line2 {
    Point p0; // would be the same as Point*
    Point p1;

}

void foobar(Line line) { // would mean Line* line
    ...
}

void foobaz(Line! line) { // would mean Line line
    ...
}
Run Code Online (Sandbox Code Playgroud)

我们不考虑可读性,例如,有些人认为 - >明确指出这是一个指针.这不是重点.

这是一个问题:使用这种语法可能会出现什么问题或角落案例?例如:'使用这样的语法,就不可能做到这一点或那个'

Java实际上与此提议类似:一切都是引擎盖下的指针.区别在于Java具有垃圾收集器,并且对象总是在堆中分配(对象本身,而不是"指针"),而在C中,结构可以在堆栈中分配(尽管我看到在堆中分配的大部分时间) .

如果有人想知道我为什么这么问,那是因为我正在为低级开发创建一种编程语言,我想优化常见情况的语法.虽然我喜欢C语言本身,但我不得不使用头文件(例如,在两个地方更新函数签名),缺乏对函数重载的支持(我不喜欢编写int_list_add,float_list_add)和类似. …

c compiler-construction pointers

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