register int n;scanf("%d",&n);错了?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了register int n;scanf("%d",&n);错了?相关的知识,希望对你有一定的参考价值。

C语言的题,想破头了。。。。。。。
虽然答案不太靠谱,但是,很有可能能是道巨坑的题

register int n; // n是寄存器类型变量

scanf("%d",&n); //寄存器类型变量是不能对其取地址的(因为没有地址)

c99标准是这样规定的,按照这个规则,这个scanf()就是错误的

但实际情况和编译器相关,因为register只是个请求,不一定真的分配寄存器
参考技术A register int n,在CPU的寄存器中申请了一个变量,不支持
scanf("%d",&n)输入,
将register去掉,就比较合理的解释成:将DOS控制台输入的整数,传输到以&n(变量n内存首地址)为首地址的内存中。
参考技术B register 变量必须是能被CPU 寄存器所接受的类型。意味着register
变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register
变量可能不存放在内存中,所以不能用取址运算符“&”来获取register 变量的地址。
你懂了不,register int n中的n在CPU中,不在内存中,所以&是不对的
参考技术C 正常情况下应该是能编译通过,但是会有警告。 参考技术D 可能是标点符号错误

zzz

# include <stdio.h>
int main()
{
    int a[5];
    int n; /*n是该数组中元素的个数*/
    int temp;
    int m, i, j;
    int count;  /*count是计数器*/
    printf("请输入元素的个数");
    scanf_s("%d", &n);
    for (m = 0; m < n; m++)
    {
        scanf_s("%d", &a[m]);
    }
    for (i = 0; i < n-1; i++)     /*因为第一个元素换了,所以要重新再来,值得注意的是只需要排n-1次即可*/
    {
        count = 0;
        for (j = 0; j < n-1-i; j++)     /*从第一个元素一直到后面,底下的if有j+1,千万不要超过范围,在一次内层循环结束以后最后一个属一定是最大的,所以下一次会少一次 -1*/
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j];               /*如果内层循环一个数都不换,那么数据已经排好序了,那么直接跳出*/
                a[j] = a[j + 1];
                a[j + 1] = temp;
                count++;
            }
        }
        if (count==0)
            break;
    }
    for (i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

以上是关于register int n;scanf("%d",&n);错了?的主要内容,如果未能解决你的问题,请参考以下文章

zzz

编写函数reverse(int number),它的功能是将number逆序输出,在主函数中输入一个整数并调用该函数。

南阳255

离散化

内存动态分配问题

scanf 读取啥信号?