菜鸟C语言几个小问题

作者&投稿:宇刮 (若有异议请与网页底部的电邮联系)
分析一个c语言短小程序(菜鸟级问题)~

这里确实是初学者的困难之处。
执行a=i++这句时,由于++操作符在变量之后,它的特点是先使用,后自加1,那么在这里它的执行过程就是先使用i的值,即4,将其赋值给a,那么a的值就为4了,赋值给a过后,自己本身就加1,那么i的值就成了5,所以结果应该是a=4,i=5.

因为你的那条赋值语句中,等号右边是两个整型进行运算,最终结果也一定是整型(这与等号左边的y无关),而且计算结果是小与1的小数,故取整后只能是零。

计算结果是根据所有参与运算数的类型来判断最终结果的类型的,原则是两两运算时尽量保持最大精度,而刚才的那行运算均为整型,故结果也只能是整型。

你可以这样试试:y=(js(3)+js(4)+js(5))/((float)js(6)+js(7));
将js(6)的结果转换成浮点型(转换任意一个都行),编译器为了保证最大精度,结果会以浮点型保存并显示。

呵呵
===================================================
针对你所提出的第一个问题:

首先阐明一个名词哈---
“不带参数的宏定义”:
用一个指定的标识符(即名字)来代表一个字符串,正如你上面定义的一样,它的一般形式为
#define 标识符 字符串

在预编译时将所定义的标识符替换成指定字符串的过程称为“宏展开”。

好啦,接下来就来回答你所提出的第一个问题。
对宏的展开只是将程序中的那个标识符直接换为你所指定的内容,而不会进行其他任何处理。具体的说,你在程序中定义了#define b a+40
在进行预处理的时候,直接将语句"c=b*20;"中的b替换为了a+40,请注意,不是(a+40)。所以替换后的语句就变为了:c=a+40*20;
由于乘法运算符的优先级高于加法运算符,所以先计算40*20,为800,再计算a+800,所以c的值为880。
如果你想使计算120*20的话,你需要在这样定义:#define b (a+40)

你的第二个程序是类似的情况,在预处理后NN为3+1*3+1/2
有一点需要注意:在C程序中两个整型变量运算,结果还是整型变量,故1/2=0,所以NN=3+3+0=6。
=======================================================
针对你所提出的第二个问题:
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
如果是switch(0)或者是switch(1)或者是switch(2)或者是switch(3),则共同执行一条语句printf("%d",w++);且只执行一次。
否则什么也不执行。

接下来分析此程序是如何运行的:
for(i=0;i<3;i++)
switch(w++)
{
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
w初值为0

i=0,判断i<3?成立,故进入for的第一次循环
进入switch语句,因为w++的值为0(此时w已自加1,即w=1),
故寻找case 0,故执行printf("%d",w++);输出1,并且w再自加1,w=2。

i++;i=1

此时i=1,判断i<3?成立,故进入第二次for循环,进入switch语句,w++的值为1(此时w已自加1,即w=3),
故寻找case 1,故执行printf("%d",w++);输出3,并且w再自加1,w=4。

i++;

此时i=2,判断i<3?成立,故进入第三次for循环,进入switch语句,w++的值为4(此时w已自加1,即w=5),寻找不到相应的case(),从而退出switch语句。

i++;

此时i=3,判断i<3?不成立,故退出for循环,从而结束整个程序。
综上所述,输出结果为13
=====================================================
针对你所提出的第三个问题:
后来我想了一下,结果在TC中是2,在VC中是4,我用的是VC,运行结果为4。其实输出的是一个整型变量在该编译系统下所分配的存储空间的大小。一个int型变量在TC中占两个字节,在VC中占四个字节。
呵呵 好久没看了。
分析如下:
字符数据在内存中的存储形式是以该字符相应的ASCII码存放的,例如字符'a'的ASCII码是97,在内存中实际上是以该字符的ASCII码(也就是97)的二进制形式存放的,程序在读取的时候认为它是一个整型变量,其值为97。
【所以可以对字符型变量作算术运算,其实就是对它们的ASCII码进行算术运算】

直接用 sizeof'A',sizeof函数就把后面的看作是一个整型变量,计算其所占的字节数。

【呵呵 考点啊 这个题目相当的二级啊 呵呵】

=======================================
希望我的回答能帮助你。

#define a 80
#define b a+40
main()
{
int c;
c=b*20; //c=a+40*20=880,要注意宏的使用带括号
printf("%d",c);
}
结果怎么试880?不是计算120*20吗?

#define M 3
#define N M+1
#define NN N*N/2
main()
{
printf("%d\n",NN);
}
类似问题结果怎么是6? //同理,注意宏的使用

#include <stdlib.h>
main()
{
int w=0,i;
for(i=0;i<3;i++)
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
}
结果怎么是13,
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);怎么个运行法
//case:后面如果不带break;会一直运行下面的分支,就是运行完了case 0,继续执行case 1,...

main()
{
printf("%d",sizeof'A'); //sizeof统计内存大小,我运行的结果就是1,谢谢}

1.第一题,请注意c=b*20转为c=a+40*20,宏定义没有括号
2. NN转为N*N/2,然后又转为M+1*M+1/2,问题同第一题,加括号
3+3+0=6
3.case不加break就会顺序执行下去,第一次运行w为0,进入case0,但此时w自加成为1了,顺序执行下去打印1,w又自加一次,变成2,第二次循环,w为2进入case2 但此时w自加变成3了,顺序执行下去打印3,W自加变成4,第三次循环CASE没有匹配的,所以打印了1和3,即13.
4.printf打印的是%d,字符是1,整形是2

第一个是c=b*20 等于c=a+20*40也就是80+40*20=880
第二个M+1*M+1/2 等于6.5 你输出的是整型,浮点部分就没有了
第三个switch后w进行自加,变成1,输出1然后自加变成2,再次循环后switch后变成3,输出3后变成4,再次循环运行switch运行default,无输出,所以是13
第四个字符串自带一个结束符占一字节

第一个 宏就是单纯的替换 没有计算功能 c=b*20; 就被替换成c=a+40*20;这个应该是880
第二个 3+1*3+1/2就是6.5 %d是输出整数 输出6
第3个 其实是先输出1又输出3
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);}意思是 先把w加1 然后判断 若是0-3就运行printf("%d",w++);(这个意思是先打印出w 然后w加1)
下面分析过程 i=0时候 w=0 然后加1判断是1 就运行printf("%d",w++);显示1 w加1为2
i=1时候w=2 然后加1判断是3 就运行printf("%d",w++);显示3 w加1为4
i=2时候 w=4 然后加1判断是5 没case 5或者default就运行结束switch
i=3时候 for退出 不运行switch 函数退出
第4题 应该是1 也许是编译器问题 你加个括号sizeof('A')

见注释:

#define a 80
#define b a+40
main()
{
int c;
c=b*20; // 宏b展开后为:c = 80 + 40 * 20 = 880,如果这样定义宏:
// #define b (a+40)
// 那么就会得到你预期的结果
printf("%d",c);
}
结果怎么试880?不是计算120*20吗?

#define M 3
#define N M+1
#define NN N*N/2
main()
{
printf("%d\n",NN); // 与上题一样,你把宏展开看
// NN = 3+1*3+1/2 = 6.5
// 而输出格式"%d"为整型输出,所以就截断了小数部分输出,因此为6
}
类似问题结果怎么是6?

#include <stdlib.h>
main()
{
int w=0,i;
for(i=0;i<3;i++)
switch(w++){
case 0:
case 1:
case 2:
case 3:printf("%d",w++);
}
}
结果怎么是13?

解释:
由于case语句没有使用break跳出,则进入switch都会依次进入每个case语句,我们来看看运行过程:

i = 0时, w为0, 进入switch(w++)先判断(由于是后置版本++),则进入case 0,此时w已经累加为1,依次进入case 1,2, 真正有意义的是进入case 3:printf("%d",w++);同样由于是后置版本++,则先【输出1】,此时w为2;

下一次循环:
i = 1,同理,到case 2, w增加到3,然后到case 3:printf("%d",w++); 【输出3,此时屏幕上显示为13】,此时w增加到4;

i = 2, 由于此时w值为4,switch(w++)已经找不到对应的case了,所有不产生输出;

i = 3, for循环条件不满足,结束循环。

所以最终屏幕输出为: 13

main()
{
printf("%d",sizeof'A'); //若非数组,则sizeof获取类型所占的内存大小,所以此时应该输出为1(char类型所占内存大小为1),你说在你的系统下,输出2,这不太可能(你忽悠我,呵呵)。
}


C语言菜鸟问题
呵呵 以其中一个为例子做解释 char ch1='A',ch2='b',ch3='2';yn1=ch1>='a'&&ch1<='z';因为a到z的ASCII码为97~122而A到Z的ASCII为65~90所以,字符类型的变量在内存中占据一个字节,并且实际可以对应到0~255的数值。通过逻辑运算的大小比较,自然就可判断是大小写咯 ...

请懂C语言的高手帮我做几个题,很重要,菜鸟勿扰
1.a*b*c 2.B66 3.-12 4.D 5.D 6.C 7.A 8.C 9.C 10.B 11.D 12.A

请回答菜鸟一些C语言问题
是传变量A所要的内存地址。正如其它网友讲的,因为你传A的值到SUB函数的话,计算完后,函数没有返回值,main函数中传递A的地址,SBN函数中接接收A的地址,计算完后,MAIN函数中A变量所在的地址的值就被修改。要返回值可用返回函数,在一个函数中若要返回多个值就用传递地址的方式。

C语言菜鸟问题
指针为内存操作而生,好处坏处都不少。。。至于开辟空间的问题你可以这样看:void sort(int *a,int n);int a[5]=...;sort(a,5);数组做形参时默认为地址传递,只传递数组第一个值的地址值即可,没有指针存在的情况下要用值传递,若数组很大,那么开辟空间值传递时就很浪费空间...当然C++里有...

关于C语言的菜鸟问题
1. 语法错误。i没有赋予初值。改发1:for(i>0; i<=10; i++)应为 for(i=0; i<=10; i++)这样实现11次循环;改法2:定义改成:int small, big, i=1;实现10次循环。2.inp=getchar();和putchar(inp);加在最后,去掉getch();前者表示从键盘读入一个字符并赋给inp,然后再循环时...

有关C语言的几个问题
主要是因为数值在内存中是以补码形式存在,所以你的1000000000000001是原码而不是补码,补码是原码按位取反再+1所得。至于'\\0',本身是一个转义字符,代表字符串结束。

菜鸟的c语言问题
当a=17时,a%3=2,%是用来求余数的,17除以3的余数是2,所以a%3==2是真命题,从逻辑上讲,整个a%3==2的值为1,然后a-17为0;||是“或”的意思,“1”和“0”的或为1。

c语言菜鸟问题
求自然常数e,公式的确是exp(x) = 1 + (x^1)\/1! + (x^2)\/2! + ... + (x^n)\/n! ,不过你的函数有问题:x^n的^我用的vc的编译器就不能识别,将你的复制以后编译就有一下错误和警告:F:\\C_test\\Test.cpp(3) : error C2448: '<Unknown>' : function-style initializer ...

请回答菜鸟一些C语言问题?解释要详细。
数组类型 数组名[数组大小];这是定义一个数组的基本格式。在你的例子中:float 说明这个数组元素是float型(单精度浮点型)的;count是这个数组的数组名(也是其首地址,和指针等价);5*2+3 这个表达式的值(即13)数组的大小 关于定义数组时数组的大小,有一点要注意的地方:不能是变量。

C语言问题
我一开始认为拆分为:\\t 、a、\\0、1、7、b、c、\\0(结束符)看了下面两位的拆分,我发现原来 \\017 不能像我原来想像的那样拆分。我菜鸟一个。实在不明白,写了一个测试一下,看图。测试结果表明:\\t、a、\\017、b、c (共5个) 还要再加上字符串常量结尾的 \\0 ,所以是 6个。

埇桥区19363377208: 菜鸟学C语言遇到的小问题
宇罡诺迪: 因为300已经超过了2位,就按实际值输出! 如果不够2位,就向右对齐.比如3不够2位,那么3就向右对齐前面空一位.

埇桥区19363377208: 菜鸟级的C语言问题 -
宇罡诺迪: 呵呵,只是上一个程序,for循环体不对,改成下面这样的就对了:main() { float k1=0,k2=0,k3=0; int i; float c=0,b=0; for(i=1;i<=100;i++) k1=k1+i; for(i=1;i<=50;i++) {b=i*i; k2=k2+b; } for(i=1;i<=10;i++) { c=1/i; k3=k3+c;} printf("%f",k1+k2+k3); } 你可以试一试

埇桥区19363377208: C语言菜鸟问题
宇罡诺迪: 不会,warning,警告,一般是不会出问题 比如你定义了int i;结果整个程序下来都没用到 i; 有时 mian()前面没加void 也会出现warning,呵呵 加油!!!

埇桥区19363377208: C语言的菜鸟级问题
宇罡诺迪: break可以用在循环和switch语句,continue只用于循环. break是跳出块,continue只是这一次不做而已. 举个例子: for(i=0;i<10;i++) 如果循环体里面是break,那循环执行了一次就跳出了,如果是continue,则循环执行10次,只是continue后面的语句不执行罢了.

埇桥区19363377208: 菜鸟C语言几个小问题 -
宇罡诺迪: 呵呵=================================================== 针对你所提出的第一个问题:首先阐明一个名词哈--- “不带参数的宏定义”:用一个指定的标识符(即名字)来代表一个字符串,正如你上面定义的一样,它的一般形式为#...

埇桥区19363377208: C语言的一些初级小问题
宇罡诺迪: 一开始 a=12;之后 a+=a-=a*=a;是这样计算的,赋值运算时右运算,从右计算之后再向左便赋值 先算: a*=a,即a=a*a ,故a=144 再算,a-=a 即 a=a-a,故a= 0 最后算,a+=a;即 a=a+a;故 a=0; 我们可以再VC 6.0中编译,运行看看分析得对不对,一下代码可以验证; #include<iostream.h> void main() {int a=12; a+=a-=a*=a; cout<<"a="<<a<<endl; } 运行之后是:

埇桥区19363377208: 急~~~~~~~一个菜鸟的简单C语言问题,求高手解答... -
宇罡诺迪: 这个是char型的问题 你改成这样就行了scanf(" %c",...

埇桥区19363377208: C语言菜鸟的一个小问题!
宇罡诺迪: if(c>5);多了个分号

埇桥区19363377208: C语言菜鸟问题 -
宇罡诺迪: 是字符型变量,即char类型,比如字符a表示为'a',而不是"a"(这种是字符串了,实际包含'a'和结束符'\0'两个字符) 你用字母的说法是不严谨的,一个字母即可以是字符,也可以是字符串

埇桥区19363377208: 菜鸟的c语言问题
宇罡诺迪: #define ReadFlash(adress) (*((volatile INT16U *)(adress<<1))) 这是一个带参宏定义,一般写在程序的开头. 它表示在下面的程序中 出现的ReadFlash(adress)的地方全部用(*((volatile INT16U *)(adress<<1)))进行替换,其中adress是参...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网