MD.*_*sar 6 c variables variable-declaration
我有以下代码
#include<stdio.h>
int main()
{
int a12345678901234567890123456789012345;
int a123456789012345678901234567890123456;
int sum;
scanf("%d",&a12345678901234567890123456789012345);
scanf("%d",&a123456789012345678901234567890123456);
sum = a12345678901234567890123456789012345 + a123456789012345678901234567890123456;
printf("%d\n",sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是,我们知道ANSI标准识别最多31个字符的变量......但是,两个变量最多相同,最多35个字符......但是,程序编译仍然没有任何错误和警告并给出正确的输出......
但是如何?
它不应该给出重新声明的错误吗?
eff*_*ffe 10
[...]我们知道ANSI标准识别最多31个字符的变量[...]不应该给出重新声明的错误吗?
好吧,没必要.由于您提到了ANSI C,这是C89标准的相关部分:
"实施限制"
实现应至少将内部名称的前31个字符(宏名称或没有外部链接的标识符)视为重要字符.相应的小写和大写字母是不同的.该实现可以进一步将外部名称(具有外部链接的标识符)的重要性限制为六个字符,并且可以忽略这些名称的字母大小写的区别.10 这些对标识符的限制都是实现定义的.
任何重要字符不同的标识符都是不同的标识符.如果两个标识符在非重要字符中不同,则行为未定义.
http://port70.net/~nsz/c/c89/c89-draft.html#3.1.2(强调我的)
它也明确地描述为一个共同的扩展:
标识符的长度和大小写
标识符中的所有字符(有或没有外部链接)都很重要,并且观察到大小写区别(3.1.2)
http://port70.net/~nsz/c/c89/c89-draft.html#A.6.5.3
所以,你只是在利用编译器的C实现选择.