C 两种不同的输出 #包括 内部主(空) { 静态int i=i++,j=j++,k=k++; printf(“i=%dj=%dk=%d”,i,j,k); 返回0; }
Turbo C 4.5中的输出: i=0 j=0 k=0 在gcc中,我得到一个错误: 初始值设定项元素不是常量C 两种不同的输出 #包括 内部主(空) { 静态int i=i++,j=j++,k=k++; printf(“i=%dj=%dk=%d”,i,j,k); 返回0; },c,initialization,operators,C,Initialization,Operators,Turbo C 4.5中的输出: i=0 j=0 k=0 在gcc中,我得到一个错误: 初始值设定项元素不是常量 哪个逻辑正确?我有点困惑。我想GCC在这里是正确的。初始值设定项不应是变量。 在定义变量之前,尝试用它本身初始化变量 我猜Turbo C的“原因”是,I毕竟是静态变量,因此应该是零值(因为所有静态变量都有默认值),然后继续忽略++操作。buddy你没有初始化变量并增加它们,由于你还没有初始化任何变量,它将接受垃圾值,我认为增加任何垃圾值都不是正确的做法。因此,请先初始化变量,然后增加
哪个逻辑正确?我有点困惑。我想GCC在这里是正确的。初始值设定项不应是变量。 在定义变量之前,尝试用它本身初始化变量
我猜Turbo C的“原因”是,
I
毕竟是静态变量,因此应该是零值(因为所有静态变量都有默认值),然后继续忽略++操作。buddy你没有初始化变量并增加它们,由于你还没有初始化任何变量,它将接受垃圾值,我认为增加任何垃圾值都不是正确的做法。因此,请先初始化变量,然后增加它们。U将得到正确答案。标准说明了初始化(6.7.8):
四, 具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字
(这来自C99,但C89的说法几乎完全相同。)
所以看起来GCC比15年前的废弃软件更正确。(谁会这么说?我知道这不是答案,但是,为什么要用一个复杂的例子来测试呢 好吧,让我们把一切都简化:
#include<stdio.h>
int main(void)
{
static int i=i++, j=j++, k=k++;
printf("i = %d j = %d k = %d", i, j, k);
return 0;
}
但是如果
i = 0
GCC在这里是正确的
static
将变量初始化(在程序加载时)为初始化器中指定的值(如果未提供初始化器,则初始化为0)。由于此初始化发生在程序启动之前,因此静态
变量的初始化器必须是编译时常量。
包含++运算符的表达式显然不是常量表达式。静态变量会自动初始化为0。@Parixit,oops我错过了那个关键字。很明显,任何人都不应该再次使用Turbo C。只是说,+2作为参考,+1作为最佳答案
i = 0
#include<stdio.h>
int main(void)
{
static int i=i;
printf("i = %d", i);
return 0;
}
prog.c: In function ‘main’:
prog.c:4: error: initializer element is not constant