两种不同的输出
#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;
}
输出在Turbo C++ 4.5:两种不同的输出
i = 0 j = 0 k = 0
在GCC,我发现了错误:
Initializer element is not constant
哪一个是逻辑上是正确?我有点困惑..
标准说,大约初始化(6.7.8):
4 All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.
(这是从C99,C89,但几乎说完全一样的东西。)
所以它看起来好像GCC不止正确15岁的弃用软件。 (谁会推它呢?)
我猜GCC在这里是正确的。初始化器不应该是一个变量。 在尝试定义之前,您尝试使用自己初始化变量。
我猜Turbo C的“原因”,即i
毕竟是静态变量,因此应该有值为零(因为所有静态变量都有默认值),然后继续忽略++操作。
静态变量会自动初始化为0. – Parikshita 2010-10-11 13:00:25
@Parixit,oops我错过了那个关键字。 – 2010-10-11 13:04:45
好友你还没有初始化变量和增加它们,因为你还没有初始化任何变量它将采取垃圾值,我不认为如此增加任何垃圾值是正确的事情。所以请首先初始化变量然后增加它们。你会得到正确的答案。
嘿..我想你错过了静态关键字.. – Parikshita 2010-10-11 13:16:38
我知道这不是一个答案,但仍然,为什么使用一个复杂的例子进行测试?
好吧,让我们简化了一切:
#include<stdio.h>
int main(void)
{
static int i;
printf("i = %d", i);
return 0;
}
输出:
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
GCC是正确的在这里。
static
变量初始化(在程序加载时)为初始化程序中指定的值(如果没有给出初始化程序,则将其初始化为0)。由于此初始化在程序启动之前发生,因此变量static
的初始值必须是编译时常量。 包含++运算符的表达式显然不是一个常量表达式。
很明显,没有人应该再次使用Turbo C。只是说。 – Ruel 2010-10-11 13:14:14
或'int i = i ++'。 – Ken 2010-10-11 14:26:22