高手看一下C语言的这道题

高手解释一下这道c语言的题~

#include
void
main()
{
int
a,b;
a=1;
b=(a++)+(a++);/*题目应该是这样的*/
printf("a=%d
,a");
printf("b=%d
,b");
}
a自增2次是3,这个没什么好说的,关键是b是2,还是3的问题,其实这个编译器优化后b=(a++)+(a++);相当于
b=a+a;a++;a++;
结果给出2,就是这个意思,其实有的编译器会把这个优化为a++;b=a+a;a++;那么结果就是3了
这是个编译器相关的问题,我只是给出了结果的原因,一般不要使用这种方法,容易出错的。

源文件就有问题.
最后结果是abcbcc

程序改为如下,在VS2005下可以运行

#include
//包含string,所以就可以用strcpy这个字符串复制函数
#include
//包含stdio.h,这样就可以用printf
void main()
{
char ch[]="abc",x[3][4];
//建立字符串一惟数组ch,和二唯的x,字符串ch已经被定义了大小,是ch[4],最后是字符串结束标志"\0",自动加上的。
int i; //循环用的i
for(i=0;i<3;i++)
strcpy(x[i],ch);//把ch里的内容,给x[i]
//最后x中的内容就是x[0]="abc\0",x[1]="abc\o",x[2]="abc\o"
for(i=0;i<3;i++)
printf("%s",&x[i][i]); //输出的时候就不一样了,因为里面是%s,所以从x[i][i]开始输出,直到输出到"\0"的时候,就停止
printf("
"); //换个行
getchar();//等个按键,方便咱们看最后结果。
}

问题①:间址运算符是什么问题
“*”符号在用于取值时,我们叫它“指针运算符”,或者叫它“间接寻址运算符”(简称是“间址运算符”),或许我们叫它“取值运算符”更贴切。它跟&相反,&是取一个变量的存放地址,而*是取一个指针指向的变量的值。如,先声明一个变量a:int a,再声明一个指针b:int *b,并把a的地址放到b中,这时用到了取址运算符&:b=&a。如果后面给a赋值3,可以用a=3完成,也可以用取值运算符:*b=3完成,两种方法起到的作用完全相同。如果要计算c=a+6,可以写成c=*b+3。
问题②:解析中 为什么说*是指针运算符,在那个位置不应该是指针类型说明符吗,不应该是运算符呀
前面分析过,“指针运算符“与”间址运算符“是同一个意思的两种叫法,在变量声明中,前面的*只是说明这个变量是指针型变量,跟运算符没有任何关系,如果不是在说明语句中,这个赋值的正确写法应该是p=&a,所以p前面的*只是一个变量类型说明符,你是对的![解析]中的说法是错误的,纯属误人!

解析瞎说的
那就是个类型声明

求大佬帮我看下这道c语言题
答:题目有问题 int c[2][3];表示c有2排3列,c语言中数组下标从0记起,c[2][1]相当于c的第3排第2列,属于越界操作,使用了c后面的第2个int 按照一般的规则来说c后面的第二个int应该是j,循环过后j的值为3,打印出来的应该是3 但一些编译器生成的栈中变量的顺序、间隔以及未初始化区域的默认...

C语言,题目有图,刚入门,有些过程看不懂,希望答案有详细过程?
答:源程序的每一句解释(见注释),运行结果,程序的功能和运行结果分析如下 include<stdio.h> void main(){ union//定义一个包含长整型和字符型数组的联合结构 { long b;//定义一个长整型 char c[4];//定义一个字符型数组 }s;//定义一个联合结构的变量s s.b= 0xa0000L;//对联合中的长整型...

麻烦C语言高手看看这道题我做的差一点就通过了,但实在找不出错误了...
答:字符串数组小了1,题目是说字符串长度不超过100000,加上字符串最后的'\0',你声明c和s的时候忘了计算这个'\0'的长度了。

求大神给我解答一下这道C语言题
答:首先你需要明白前缀自增运算符和最后自增运算符,前缀是先加后用,后缀是先用后加。然后就是执行while里面的语句的条件是只要不为0即可。现在开始分析程序:a=-2,条件为真,a++,a=-1;++b,b=1,条件为真。执行;语句之后开始下一次:a=-1,条件为真,a++,a=0;++b,b=2,条件为真。执行...

C语言,高手看看这道题这么做有什么问题?
答://这儿是整形除法(C语言中两个整数相除,1/2 = 0),y1为0 do { m = 1; //m需要每次重新初始化 for(j=1;j<n;j=j+1) //语法格式不正确 { m=m*j;} y1=1/m;y=y+y1;n++;}while(y1>=10e-4);printf("y=%lf\n",y);return 0;} 不过你这个写法效率太低,中间的那个...

一道C语言编程问题,高手们来看看帮忙解答下
答:int b;int c;int sum;//ABC之和。for (a = 100;a > 0;a--)//以A为循环变量,在1到100之间。{ for (b = a-1;b > 0;b--)//以B为循环变量,在1到A之间。{ for (c = b-1;c > 0;c--)//以C为循环变量,在1到B之间。{ //判断公式左右两侧是不是相等,相等侧符合题...

谁能帮我解释一下这道c语言题目啊 不懂
答:⑤c格式:输出一个字符。⑥s格式:用来输出一个串。有几中用法 s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。-ms:如果串长小于m,则在m列范围内,字符串...

学生来看这8道C语言谜题你能答对几个
答:C语言8个语言谜题答对几个 1、下面的程序并不见得会输出"hello-std-out"你知道为什么吗?参考答案:stdout和stderr是不同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会被输入:遇到回车; 缓冲区满;flush被调用。而stderr则不会。2、下面的程序看起来是正常的,...

我是初学C语言,看不懂你这题(看不懂的地方我标注了一下啊)
答:!(a>b)=!(3>4)因为(3>4)是错的,所以用0表示,又因为前面!,所以用1表示 (!c)因为c=5,不等于0,所以c是真值,前面加个!,就说明整体是假值,所以最后逻辑值为0 另外,扩展一下,对于这道题中的c,!!c的值应该为1。!!c=!(!c)=(!0)=1。这也是通过上述解释...

c语言中的一道题,请帮帮解释一下sprintf(b,"%s%c",s+1,*s);为何意?
答:满足这两个条件的字符组合都可以作为字符串。现在反过来想想,如果我们要得到一个字符串的内容,需要什么信息?是首地址。因为字符串是地址连续的,而且我们已经知道结尾的位置是0,所以只要有了首地址,我们就可以一个字符一个字符的读取整个字符串。现在可以理解,为什么c语言中对字符串只认首地址。这同时...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网