C语言中奇怪的语法问题:`1i`含义与`if`语句解析
关于C语言
if (i != 1i != 2 && j != 1)的语法解析 1. 1i到底是什么?
1i是GCC编译器独有的非标准扩展,用来表示复数类型里的虚数单位i。它和标准C里<complex.h>头文件定义的_Complex_I等价,类型为_Complex double,数值对应数学中的√-1。哪怕没包含<complex.h>头文件,GCC也允许直接使用这个写法。
2. 奇怪的条件语句如何运行?
C语言的运算符优先级与结合性规则决定了表达式的执行顺序:
!=是左结合运算符,优先级高于&&- 编译器会把原表达式拆解为:
具体执行步骤:((i != 1i) != 2) && (j != 1)- 先计算
i != 1i:如果i是普通整数,会被隐式转换为_Complex double类型(实部为i的数值,虚部为0),再和1i(实部0,虚部1)比较。不管i取值如何,这个比较结果只能是0(假)或1(真)。 - 再用第一步的布尔结果与2比较:0和2不等、1和2也不等,所以
(i !=1i) !=2的结果必然是1(真)。 - 最后执行
&&逻辑与:只要j !=1为真,整个条件就成立,对应的代码块执行后让变量k的值变为6。
- 先计算
重要提醒
这种写法完全依赖GCC扩展,不属于标准C语法。换用其他编译器(如Clang、MSVC)大概率会报错,实际开发中不要使用这类非标准代码。
内容的提问来源于stack exchange,提问作者wuj-jay
相关产品推荐
相关产品推荐

