不一样的C语法(一)无限加减

1. 奇特语法

int a = -+-+-+-+1;
int b = +!+!+!+!2;
int c = +~-+~-+~3;
int d = !1-2+!~-3;


2. 原理浅析

            我不是很清楚上述代码的特性是否是在C99这一标准中最先定义的,还是在以前的标准中早有定义。我查阅了C99标准,在其第6章第6.5.3 Unary Operators一节中有提到:`&`、`*`、`+`、`-`、`~`、`!`属于一元操作符(unary-operator),同时后面提到`*`、`+`、`-`还是二元操作符(binary-operator)。


            在6.5.6 Additive operators一节的Constraints(约束条件)中,说明了`+`、`-`操作符作为二元操作符的条件:

只有`+`、`-`操作符两边的操作数都为数值类型(即整数、小数等),或者一边为指针,一边为整型时,`+`、`-`才被当作二元操作符。


            在6.5.3.3 Unary arithmetic operators一节中的Constraints(约束条件)中,说明了`+`、`-`、`~`、`!`作为一元操作符的运算规则:

`+`、`-`的操作数要为算数类型,`~`的操作数要为整型,`!`的操作数要为标量类型。`+`的结果是原操作数,`-`的结果是原操作数的负数,`~`的结果是原操作数取非,`!`的结果是原操作数取反。


            所以,根据这些内容:

int a = -+-+-+-+1;
int b = +!+!+!+!2;
int c = +~-+~-+~3;

这三条语句中,`+`、`-`都为一元操作符,因为操作符的另一边不是数值类型,所以+1等效于1。因此,这里的+号并未起实际任何作用,所以表达式 int a = -+-+-+-+1 的意思为:a等于对1取负再取负再取负再取负,即a = 1;b等于对2取四次反,得b = 1; 同理,去掉`+`号,运算得c = -6。

int d = !1-2+!~-3;

这句中,`1-2`中的`-`属于二元操作符,因为此刻`-`操作符两边满足都为数值类型这一条件,故应读作`减`,而`-3`的`-`属于一元操作,读作`负`。


3. 代码示例

int main(int argc, char** argv)
{
	return
	+-0-+-+-0-+-0000000-+-0-+-+-+-+-0-+-+-+-+-+-000-+-+
	+-0-+-+-0-+-0-+-+-+-+-0-+-+-+-+-0-+-+-+-+-00+-+00-+
	+-0000000-+-0000000-+-0-+-+-+-+-0-+-+-+-+-0-+-+-0-+
	+-0-+-+-0-+-0-+-+-+-+-0-+-+-+-+-0-+-+-+-+-00+-+00-+
	+-0-+-+-0-+-0000000-+-0000000-+-0000000-+-+-000-+-+
	+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	+-0-+-+-0-+-+-000-+-+-000000+-+-0-+-+-+-+-00000-+-+
	+-0-+-+-0-+-00+-+00+-+0-+-+-0-+-0-+-+-+-+-0-+-+00-+
	+-0-+0+-0-+-0+-+-+0-+-000000+-+-0-+-+-+-+-0-+-+-0-+
	+-+0-0+0+-+-00+-+00-+-0-0-+-+-+-0-+-+-+-+-0-+-+00-+
	+-+-0-0-+-+-+-000-+-+-0-+0000-+-0000000+-+00000;
}


你可能感兴趣的:(c,语法,标准,特殊)