而不是2*i
,我不小心写道2i
:
int foo(int i)
{
2i;
return 2i;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译器能够捕获错误.但事实并非如此.那么,2i
在C有效的语句?如果是这样,它做什么?困惑!
我使用gcc版本5.3.0编译,这里是程序集输出:
.file "strange.c"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
nop
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 5.3.0"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
Iha*_*imi 107
这是一个gcc扩展,2i
是虚数常量.所以你可以像这样编写一个复数:
#include <complex.h>
_Complex x = 4 + 5i;
Run Code Online (Sandbox Code Playgroud)
chq*_*lie 13
2i
是一个gcc
复数整数文字的扩展名,是两个平方根的纯虚数-1
.此扩展也受到支持clang
.
令人惊讶的是,您的编译gcc 5.4.0
生成了已发布的程序集输出:
gcc
5.3.0 获得了编译错误http://gcc.godbolt.org/#
:: error: cannot convert '__complex__ int' to 'int' in return
.foo
不正确:它不返回0
.将复数整数常量转换2i
为int
应返回其实部0
.相反,使用clang
3.7时,它会在没有警告的情况下编译并生成最佳代码,但当然不是您所期望的:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Run Code Online (Sandbox Code Playgroud)
此语法可以按任何顺序与其他后缀组合.编译下面的代码clang -Weverything
给了我适当的警告warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:
#include <stdio.h>
int main() {
/* complex integer literals */
printf("sizeof(2i) = %zd\n", sizeof(2i));
printf("sizeof(2ui) = %zd\n", sizeof(2ui));
printf("sizeof(2li) = %zd\n", sizeof(2li));
printf("sizeof(2lli) = %zd\n", sizeof(2lli));
/* complex floating point literals */
printf("sizeof(2.i) = %zd\n", sizeof(2.i));
printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
/* alternate order */
printf("sizeof(2il) = %zd\n", sizeof(2il));
printf("sizeof(2ill) = %zd\n", sizeof(2ill));
printf("sizeof(2.if) = %zd\n", sizeof(2.if));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它在我的环境中生成此输出:
sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8
Run Code Online (Sandbox Code Playgroud)
使用语法着色编辑器尝试最后一个 ;-)
归档时间: |
|
查看次数: |
4235 次 |
最近记录: |