初学C语言,下面这个程序有点模糊,高手分析一下下面的代码:说明一下原因....
这个程序是不是要把最小的数挑出来,与array[9]交换?若果是的话,要求j<10,是因为要array[i]与array[j]相比较,不能j比i小。
%*[^0-9]%d这是scanf中使用正则表达式的用法,*表示将跳过后面表达式(即[^0-9])所匹配的项,而[^0-9]表示非0-9之间的表达式,即输入直到出现数字0-9,数字之前的表达式都被过滤掉。
后面的%d就是读取一个整型啦。
所以如果输入a111b222ccc333
那么首先a匹配%*[^0-9],将被忽略掉,然后读取111到t,然后再忽略b,再读取222,以此类推。
a和b可以指向两段不同的只读地址,只不过这两段内存区域存储的字符串内容都是"hello".
所以他们内容相同,但是地址却可以不同. 结果可能为NO.
但是,因为两个字符串常量内容相同,又是只读的,所以编译器可以进行优化,把这两个地址指向同一个区域,节省内存。所以这里的答案可以是YES.
相同的字符串常量是否指向同一个地址,由编译器来决定(见C++作者写的<<C++程序设计语言>>)
对于C语言, 见C语言标准ISO C99 (6.4.5/6节):
It is unspecified whether these arrays are distinct provided their elements have the appropriate values.
对于C++, 见ISO C++-98 (2.13.4/2节):
Whether all string literals are distinct(that is, are stored in non overlapping objects) is implementation defined.
可见无论C和C++,都规定相同内容的常量指针地址,未必指向相同地址。这个留给编译器,自由优化。
所以,可以肯定,用地址来比较指针,结果是不可靠的。根据C和C++的标准,这个代码的结果可能是YES,也可能是NO. 对gcc, 结果可能是YES, 对一些TurboC, 默认没有打开优化,结果可能是NO.
总之,无论是为了写出足够可靠的代码,还是为了可读性,都不要用地址进行比较。因为标准已经说明,这个结果是不确定的。
以上代码如果换成
char a[] = "hello";
char b[] = "hello";
结果就一定是NO
要想比较内容, 用strncmp.
#include <string.h>
#include <stdio.h>
main()
{
char *a = "hello";
char *b = "hello";
if(strncmp(a, b, strlen(a)+1) == 0)
printf("YES");
else
printf("NO");
}
char *a = "hello"; //这样的"hello"叫做字符串常量,保存在常量区,并且相同的字符串常量只有一份,也就是说 a和b指向同一个地方了,所以输出是yes
即使是这样也一样,"hello"还是一份
#include<stdio.h>
char *a = "hello";
int main()
{
char *b = "hello";
if(a==b)
printf("YES");
else
printf("NO");
}
if(a==b)
在数组比较的时候,不能这么比较,
只能一个一个的比较
字符串有几个系统的函数可以用
strcmp这个是比较字符串的
你的程序中,ab是指针,
a==b这个是ab指针比较,当然是内存空间的地址,一般来说不可能分配在一个地方,所以只能打出no
逻辑上,a,b均为两个地址,指向2个“hello”字符串的地址,是2个,应该不同;编译器在编译程序的时候,按大部分编译器的默认设置,在分配给这两个“常量”字符串分配空间存储的时候,发现内容是相等的,所以进行了优化,共用了一个存贮空间,共享了一个地址,所以a、b是相等的。
结果是yes
说明: 1. 输出yes的意思是,a b的地址相等,并不是说a b各自指向的字符串内容相等,如果比较字符串需要用
strncmp(a, b, strlen(a)+1) == 0
2 。编程中,不建议进行类似编写,因为不确定因素太多了,因为机器和编译器设置的参数的不同,可能会导致不同的结果。另外编程逻辑上也存在问题。
a值为hello,b值为hello,a=b成立,故输出yes
学生来看这8道C语言谜题你能答对几个
C语言8个语言谜题答对几个 1、下面的程序并不见得会输出"hello-std-out"你知道为什么吗?参考答案:stdout和stderr是不同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会被输入:遇到回车; 缓冲区满;flush被调用。而stderr则不会。2、下面的程序看起来是正常的,...
C语言学习资源整理
C语言学习资源汇总 一、C语言入门课程 1.实验楼一C语言入门教程 教程+在线开发环境的方式,教程文档详细的讲解C语言基础知识,在线开发环境和本地一样,可以随时动手跟着教程操作,动手学习的方式非常适合入门初学者。 2.gitbook一一笨方法学C 内容较完整丰富,相当于一本书籍了,适合新手入门学习。 3.菜鸟教程一C 语言...
c语言怎么学,从什么地方开始学?
很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的C\/C++程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听...
新手同学学C语言推荐哪些软件
新手学习C语言一般用什么软件 1、Dev-C++ Windows 环境下的一个轻量级 C语言\/C++ 集成开发环境(IDE),遵守GPL许可协议分发源代码。它集合了功能强大的源码编辑器、MingW64\/TDM-GCC 编译器、GDB 调试器和 AStyle 格式整理器等众多自由软件,操作十分便捷。 2、Code::Blocks 这是一个开源、跨平台的C\/C++开发软件,...
我今天刚学习了c语言,感觉是一点听不懂,我该怎么办呢
如果刚开始接触c语言,听不懂也正常,不要有畏惧的心理,有些小伙伴可能看到部分同学什么都会,自己就很气馁,因为这部分同学很可能接触编程比较早,即使小孩学走路也有一个过程,刚开始有走路欲望->学会站立,腿部有力量->尝试走路,不断练习->学会走路。所以不要慌。学C语言与走路一样,刚开始一定要...
学生必看c语言必看常见符号分类集合贴
关键字,又称为保留字,他们是C语言中预先规定的具有固定含义的一些单词,例如C语言的第一个程序中的int和return等,用户只能按预先规定的含义来使用他们不能擅自改变其含义。 2、标识符 标识符分为系统预定义标识符和用户自定义标识符两类。 顾名思义,系统预定义标识符就是由系统预先定义好的,例如主函数main和输出...
c语言要学多久
学习C十十编程,可以根据个人情况而定,如果有一定的基础,大概至少需要一个月的时间;如果是初学者,大概需要两个月的时间。1、学习目标与基础知识:在开始学习C语言编程之前,需要明确自己的学习目标并了解一些基础知识。如果之前没有接触过编程,可能需要花费一些额外时间来熟悉计算机的基本操作和术语。2、...
如何学习学习c语言,现在学这个是否还必要
顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C...
C语言—入门技巧大学生推荐
如果qoto语句已经过时,那么对程序创建无限循环应该如何去做呢,这是一些硬件工程师可能会疑惑的问题。毕竟,之前都是通过创建一个goto语句然后再返回到main语句。解决这一问题就要利用C语言中已经存在的循环语句for和while 技巧3: 使用合适的条件语句 除代码的可读性之外,程序的执行时间还主要依赖干做决定时所选择的条件...
学习C语言,我知道要多敲代码,是把书上的例子都敲一遍吗?还是要其他方法...
这样的话我觉得会比机械的敲代码效果更好呀;多多注重一题多解呀。比如说书上的例子提供了问题的一种解法,但是因为课本这种东西一般来说是比较经典的,所以很多知识可能很久都没有更新了,那么你也可以除此之外多学习一些简便的方法,或许通过一种新的方法也可以把这个问题解决,而且代码还会更加简洁高效...
铎邵博思: a == b 比较的是地址,不是内容.a和b可以指向两段不同的只读地址,只不过这两段内存区域存储的字符串内容都是"hello".所以他们内容相同,但是地址却可以不同. 结果可能为NO.但是,因为两个字符串常量内容相同,又是只读的,所以编...
武冈市17762507442: C语言菜鸟求解 下面这个程序错在哪里 菜鸟 - ?
铎邵博思: #include // 缺少头文件 main() { int x,y,z;...
武冈市17762507442: C语言,下面这个如何理解,感觉好奇怪,不太明白,求指点 - ?
铎邵博思: 我把格式给你调整了一下 也许你看这个会清楚点,是等效的.#include<stdio.h> int main() { int a[5]; int i; for(i = 0;i < 5;i++) { a[i]=i * i; printf("a["); printf("%d",i); printf("]="); printf("%d\n",a[i]); } return 0; }
武冈市17762507442: 求高人指点C语言这个程序哪错了(我是初学者,不是太懂,简明一些) - ?
铎邵博思: 哪里错了放编译器里跑一下就知道了,学习语言同时也要学习解决问题的能力.scanf("%d,%d,%d",a,b,c);//书上看看应该怎么写 冒泡排序 int i,j,temp; int a[n]; for(i=0;i scanf ("%d,",&a[i]); for(j=0;j{for (i=0;i if (a[i]>a[i+1]) {temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } for(i=0;i printf("%5d,",a[i] ); printf("\n");
武冈市17762507442: 我是c语言的初学者,我想问一下下面这个程序有什么错误么,为什么总值编译失败? - ?
铎邵博思: #include <stdio.h> //头文件声明丢了int main() //主函数返回值丢了{ int a,b,c,d,e; //分号丢了 a=3+1; b=3-1; c=3*1; d=3/1; e=3%1; printf("%d\n",a); printf("%d\n",b); printf("%d\n",c); printf("%d\n",d); printf("%d\n",e); getch(); return 0; //返回值丢了}
武冈市17762507442: C语言菜鸟 求解 下面这个程序哪里错了 怎样改 - ?
铎邵博思: 该程序的功能应该是将一个大于2的偶数分解成两个素数之和,所...
武冈市17762507442: c语言初学者,给看看下面这段程序错哪了 - ?
铎邵博思: #include main(){ int i,j; for(i=1;i<=9;i++) ///后面没有分号 { for(j=1;j<=i;j++) //后面没有分号 printf("%c"...
武冈市17762507442: C语言新手 下面那里错了 为什么错了 我逻辑有点混乱了 - ?
铎邵博思: for(sum=a;sum...
武冈市17762507442: 求c语言大神帮忙!下面这个 程序哪儿错了?以及这个程序的功能是什么? - ?
铎邵博思: 这个程序的功能是学会静态变量的操作(静态变量的有效范围是全局,所以在非主函数里修改是有效的),并用程序做一个修改前与修改后的对比.哪些地方有错,你对比下面的程序即可,此程序可以直接使用.#include <stdio.h>void add(int n,...
武冈市17762507442: C语言新手 下面程序那里错了 (是语法错误) - ?
铎邵博思: 你的代码有几个错误, 一、没有添加头文件#include <string,h> 二、printf("%s,%s\n",sp[i].name, sp[i].unm);写错了参数,应为 printf("%s,%s\n",sp[i].name, sp[i].num); 三、getdata() for (i=0;i< N;i++)