【问题标题】:What is int a=(i*+3); and how c compiler will execute it?什么是 int a=(i*+3);以及c编译器将如何执行它?
【发布时间】:2020-02-11 13:38:00
【问题描述】:

这里是代码

int i = 3
int a=(i*+3);

不明白代码是

a=(i*+3)

a 的值 = 9


【问题讨论】:

  • 如果我们将子表达式分开一点应该更容易理解:int a = i * +3。相当于int a = i * (+3)。当然是int a = i * 3
  • a = i * (+3) + 是一个无用的一元运算符。

标签: c parsing operators expression


【解决方案1】:

这只是一个糟糕的代码格式。为了使声明清晰重写它像

int i = 3;
int a = i * +3;

在标记之间插入空格。虽然一元加运算符在这里是多余的。

一个更令人困惑的表达

int a = i+++3;

和这个一样

int a = i++ + 3;

来自 C 标准(6.4 词法元素)

4 如果输入流已被解析为预处理标记 给定字符,下一个预处理标记是最长的 可以构成预处理标记的字符序列。

您可以得到许多这样的混淆表达式,省略标记之间的空格。

尽管在 C 语言中存在一些你应该知道的阴暗角落。

例如,如果您有类似的函数声明

void f( int x );

那么就可以这样调用了

(**********f)( 10 );

相当于

f( 10 );

这是一个演示程序

#include <stdio.h>

void f( int x )
{
    printf( "I'm called with %d stars!\n", x );
}

int main(void) 
{
    ( **********f )( 10 );

    return 0;
}

它的输出是

I'm called with 10 stars!

【讨论】:

【解决方案2】:

C 中的使用上下文需要理解几个多用途符号,例如 + 符号,它本身至少有 3 个在 C 表达式中常见的用途:

  • 加法运算符(例如int a = 3 + 5;
  • 符号表示正值(例如int a = +3 - (+3);
  • 当翻倍时,一个值增量器。 (for(int a=0; a&lt;limit; a++))

当与其他多用途符号一起使用时,例如*,根据使用上下文来确定它是signoperator还是incrementor。

通常在这种情况下,您会使用隐式 + 符号:

int a=(i*3);// i * +3

但使用 explicit 符号也是合法的(但不那么可读)。因此,根据此声明中的使用上下文...

int a=(i*+3);// by context '+' is a sign in this case, not an operator

...只是对3 使用显式符号,这两个语句是等价的。

更易读的版本:

int a=(i * (+3));

另一个类似的看似令人困惑的场景,但具有上下文意义:

int func(int *value){

    int a = 10+*value;//by context '*' is de-referencing 'value' not multiplying
    return a;
}

注意:此处可以通过间距提高可读性:

int a = 10 + *value;  //spacing is good for readability and removing ambiguity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2012-02-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多