c中变量声明的模糊行为

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个字符......但是,程序编译仍然没有任何错误和警告并给出正确的输出......
但是如何?
它不应该给出重新声明的错误吗?

Zei*_*kon 15

许多编译器的构建超出ANSI规范(例如,识别超过31个字符的变量名称)作为程序员的保护.虽然它适用于您正在使用的编译器,但您不能指望它只适用于任何C编译器......


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实现选择.