2013-10-08 185 views
2

的执行我很困惑运算符优先级表的让步http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm令运营商

我的意思是从右到左,左到右。

我想知道我们在这个代码上应用的操作符的顺序。

int main() 
{ 
    int i[] = {3, 5}; 
    int *p = i; 
    int j = --*p++; 

    printf("j = %d\n\n", j); 
    system("pause"); 
    return 0; 
} 

它是否像--(*(p++))?或(--(*p))++?它非常混乱。有没有解决这个问题的标准规则。

+5

你应该问的问题是为什么你甚至正在考虑编写这样的代码。你喜欢痛苦吗? –

+1

我同意David的观点,一旦你了解了基本知识,如果你必须阅读文档/写一个测试/询问SO,可能你的表情很复杂,或者很可能不像预期的那样表现或者你的同事会有阅读文件/写一个测试/要求SO了解它(或两个选项)。代码行是免费的,只是让你的表达更长。 – SJuan76

+0

**注意**:表达式'( - (* p))++'(等效于' - (* p)++')将是一个**编译时间错误**:不是一个左值'。为了理解它:[为什么'++ i ++'在C中给出“需要L值的错误”](http://stackoverflow.com/questions/17850851/why-i-gives-l-value-required-error -in-c/17850934#17850934) –

回答

4

表达:

j = --*p++; 

等同于:

j = --*p; // first decrements value pointed by p, then assign value pointer by p to j 
p++;  // increment p to point to next location 

你表达的括号版本应该是:读@Jonathan Leffleranswer--(*(p++));

我也建议你阅读@Eric Lippert答案:Incrementing Pointers, Exact Sequence了解++*运营商表达的是怎样一个编译器可以在低级别执行它。

+0

除非我错了,编译器总是会将'--'作为递减运算符进行解析。 – azz

+0

@DerFlatulator是'--'作为递减运算符被解析。 '---'将被视为''-'' –

0

前缀增量和后缀增量有很多技巧。
作为一名程序员,您不需要在这些技巧上花费太多时间,只需在代码中使用括号来显示计算顺序即可。

1

++--前缀递增/递减从右到左 后来就你根据优先--将首先执行发现*

j = --*p++; 

上述说法。所以在表达式--*p预递减,然后++是后增量,将增加指针p

j= --*p; //and immediately do *p++ == p++ , because here ++ got priority. and this is post decrement this wont assign to j.this as same as incrementing p value in next statement. 
p++; 
2

我对运算符优先级表混淆让步http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm。这张表中的从右到左和从左到右的含义是什么?

优先级和关联性决定了如何将括号逻辑地插入到不完全匹配的表达式中。如果你有

x + y * z 

然后*是更高的优先级,所以它赢了,这就是:

x + (y * z) 

(x + y) * z 

如果你有两个运营商具有相同的优先级,然后哪一个取决于结合性。+-是相同的优先级,并有左到右结合,所以

x + y - z 

(x + y) - z 

而且具有不

x + (y - z) 

运营商从右到左结合放首先在最右边的表达式上使用括号。

我想知道我们在这个代码上应用的操作符的顺序。 --*p++

那么,请按照图表。我们有*,前缀递减和后缀递增。首先参考优先表。后缀增量优先于其他两个,所以自动为--*(p++)。现在我们不需要咨询桌面来完成剩下的工作;显然唯一可能的括号是--(*(p++))

+0

*'优先级和相关性决定了如何将括号逻辑地插入到不完全表达式中*相反也是如此,“括号用于覆盖表达式中运算符的优先级”。例如在'(x + y)* z'中,优先级低的'+'在'*'之前执行。 –