编译看左边运行看左边
A. c语言i++,i--问题
这个题主要考你运算符优先级,这个结合方向是从右向左,所以先看右边,再看左边。再就是++的算法,i++的话是先对其操作再++,这里就是先信码输出再++;++i是先++再随其操作,所以就是先++再输出
我觉得是8778,就是从右往悄配左算启坦指:
i--是先输出8;然后此时i为7;
i++是先输出7;然后此时i为8;
--i是输出7;i也为7;
++i是输出8;i也为8;
这是我在linux下边编译的,结果是8778,你确定编译出来是8788?
B. 如何在VS2010中运行编译C和C++
VS2010需要先新建工程项目,接着在源文件中添加cpp文件,然后再编写代码,最后编译运行就可以,下面是创建执行C++程序的步骤:
1、首先新建项目(文件-->新建-->项目)
C. C++代码怎样看运行顺序,代码看一段不知道下面从什么地方开始看啦。
按F9 在当前鼠滑型标出下断点,断点必须在程序可以运行到的语句处
菜单 工具-->开始调试,就会停在断点处
F10 单步执行语句,遇到函数调用会越过
类似于汇编下debug的 p命令
F11 单步执行语句,遇到函数调用会跟进
类似于汇编下debug的 t 命令
鼠标在某处右击,选run to cursor,代码就会执行到当前仿扒鼠标位置的语句信大猜,
类似于汇编下debug的 G 命令
D. 在java多态中,编译看左边,运行看右边是什么意思,哪位大侠能帮忙详细解释一下 谢谢了.
Animal c = new Cat(); 左边是 Animal 类(或接口) 右边是 Cat()类; 在编译的时候编译器不管你右边是什么类,只要左边的Animal类(或接口)能编译通过就不会报错。但是运行的时候就要按照右边的Cat()类实际情况来运行。
E. ++a || ++b && ++c在C语言中怎么计算
int a=0,b=0,c=0,k=0;//以下用到的所有变量都赋初值0
k=++a || ++b &&++c;
printf("a=%d b=%d c=%d ",a,b,c);
printf("k=%d ",k);
分析
很多地方说此处计算要用到优先级,其实不然
1、如果按照优先级相等来运算: ++a后a==1,++b被短路b==0,c==1
则应输出 a=1 b=0 c=1 k=1
编译运行:
分析正确
F. 程序编译错误不知道是什么原因
不能通编译过的程序实际上还不是合法的程序,因为它不满足C语言对于程序的基本要求。
检查语法错误的第一要义:集中力量检查系统发现的第一个错误,弄清并改正它。
在编译过程中系统发现的错误主要有两类:基本语法错误和上下文关系错误。这些错误都在表面上,可以直接看得见。也是比较容易弄清,比较容易解决的。关键是需要熟悉C语言的语法规定和有关上下文关系的规定,按照这些规定检查程序正文,看看存在什么问题。
编译中系统发现错误都能指出错误的位置。不同系统在这方面的能力有差异,在错误定位的准确性方面有所不同。有的系统只能指明发现错误的行,有的系统还能够指明行内位置。
一般说,系统指明的位置未必是真实错误出现的位置。通常情况是错误出现在前,而系统发现错误在后,因为它检查到实际错误之后的某个地方,才能确认出了问题,因此报出错误信息。要确认第一个错误的原因,应该从系统指明的位置开始,在那里检查,并从那里开始向前检查。
系统的错误信息中都包含一段文字,说明它所认定的错误原因。应该仔细阅读这段文字,通常它提供了有关错误的重要线索。但也应该理解,错误信息未必准确,有时错误确实存在,但系统对错误的解释也可能不对。也就是说,在查找错误时,既要重视系统提供的错误信息,又不应为系统的错误信息所束缚。
发现了问题,要想清楚错误的真正原因,然后再修改。不要蛮干。在这时的最大诱惑就是想赶快改,看看错误会不会消失。但是蛮干的结果常常是原来的错误没有弄好,又搞出了新的错误。
另一个值得注意的地方:程序中的一个语法错误常常导致编译系统产生许多错误信息。如果你改正了程序中一个或几个错误,下面的弄不清楚了,那么就应该重新编译。改正一处常常能消去许多错误信息行。
解决语法错误
常见语法错误:
1)缺少语句、声明、定义结束的分号。
2)某种括号不配对。C语言中括号性质的东西很多,列举如下:
( ), [ ], { }, ' ', " ", /* */
在不同位置的括号不配对可能引起许多不同的错误信息。
3)关键字拼写错误。
较难认定的典型错误:
1)宏定义造成的错误。这种东西不能在源程序文件中直接看到,是在宏替换之后出现的。常见的能引起语法错误的宏定义错误:宏定义中有不配对的括号,宏定义最后加了不该有的分号,……
解决上下文关系错误
1)变量没有定义。产生这个问题的原因除了变量确实没有大意外,还可能是变量的拼写错误,变量的作用域问题(在不能使用某个变量的地方想去用那个变量)。
2)变量重复定义。例如在同一个作用域里用同样名字定义了两个变量,函数的局部变量与参数重名等。
3)函数的重复定义。可能是用同一个名字定义了两个不同的函数。或者是写出的函数原型在类型上与该函数的定义不相符。有时没有原型而直接写函数调用也可能导致这种错误信息,因为编译程序在遇到函数调用而没有看到函数原型或函数定义时,将给函数假定一个默认原型。如果后来见到的函数定义与假定不符,就会报告函数重复定义错误。
4)变量类型与有关运算对运算对象或者函数对参数的要求不符。例如有些运算(如 %)要求整数参数,而你用的是某种浮点数。
5)有些类型之间不能互相转换。例如你定义了一个结构变量,而后要用它给整数赋值。系统容许的转换包括:数值类型之间的转换,整数和指针之间的转换,指针之间的转换。其余转换(无论是隐含的,还是写出强制)都不允许。参见《C语言程序设计》(K&R)197-199页。
如何看待编译警告
当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误,也可能确实没有问题。对于警告的正确处理方式应该是:尽可能地消除之。对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。只有那些确实无问题的警告才能放下不管。
注意:经验表明,警告常常意味着严重的隐含错误。
常见警告:
1)(局部自动)变量没有初始化就使用。如果对局部指针变量出现这种情况,后果不堪设想。对于一般局部自动变量,没有初始化就使用它的值也不会是有意义的。
2)在条件语句或循环语句的条件中写了赋值。大部分情况是误将 == (等于判断)写成 = 了。这是很常见的程序错误,有些编译程序对这种情况提出警告。
G. 左结合和右结合的问题~和编译原理有关
B与第一个*结合:用编译原理的运算符的结合性来解释的话,就是假设*是左结合的。当运算分量(本例中是B)两侧都有运算符(本例中是*)的时候,采用左结合。即B与B左边的*结合。
eg: L —>A*B*C 先计算 A*B 然后计算(A*B)*C。
不知道你懂么??
H. java中,什么时候需要new来实例化
(1)同一个对象在不同时刻体现出来的不同状态。
(2)多态的前提:
A:有继承或者实现关系。
B:有方法重写。
C:有父类或者父接口引用指向子类对象。
多态的分类:
a:具体类多态
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
b:抽象类多态
abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();
c:接口多态
interface Fu {}
class Zi implements Fu {}
Fu f = new Zi();
(3)多态中的成员访问特点
A:成员变量
编译看左边,运行看左边
B:构造方法
子类的构造都会默认访问父类构造
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看左边
为什么?
因为成员方法有重写。
(4)多态的好处:
A:提高代码的维护性(继承体现)
B:提高代码的扩展性(多态体现)
(5)多态的弊端:
父不能使用子的特有功能。
现象:
子可以当作父使用,父不能当作子使用。
(6)多态中的转型
A:向上转型
从子到父
B:向下转型
从父到子
I. C语言,这三种类型都怎么解释
如何判断一个指针的类型,指针指向的类型,告诉你一个简单的方法,叫 “右左法则”,具体是这样的,从未知的标识符看起,先看它的右边,再看它的左边,然后退出括号(有的话),再看右边,再看左边,一直到结束就好了。
比如这个: int (*uuf)[3][4];
从uuf开始看,先看右边,没东西,再看左边,是个 '*',表示uuf是个指针,然后退出括号,看右边,是个[][],表明uuf指向的是个数组,再看左边,是个int ,表示数组里面的元素是int.整体来说,就是
uuf是一个指向一个具有3行4列元素类型为int型的数组的指针。
再给举个例子:(int (*)(int *,int))( *ptr)[3];
从ptr看,右边,没有,左边是个*,表示ptr是个指针,出括号,再看右边,[3]表示ptr指向的是数组,再看左边,表示数组里的元素是(int (*)(int *,int))这个类型,具体(int (*)(int *,int))这个类型是啥呢,实际就是返回值为源猛int 类型的,具有int *,int两个参数类型慎配的函数指针。可以通过(int (*func)(int *,int))来判断出来func的类型。
下面这几个(1) char * fump();
(2)char (* fump)();
(3)char (* fump[3])();
通过右左法则,很容易看出来,(1)fump右边是括号,表明fump是个函数,左边的char *是他的返回值类型。(2)fump右边没有,左边是*,表明它是个指针,退出括号后,右边是(),表明指向的是一个函数,左边char,表明函数的返回值是char类型。(3)fump右边是个[3]表明fump是个数组,左边 *,表示数组元素是指针,退出括号,右边(),表明这个指针是指向函数的,即函数指针,左边char,表明这种函数的返回值是char.
对于指针的类型,也就是把这个未知的标识符去掉后,剩下的部分,就是指针的类型,就用上面的法则判断就ok.对于指针指向的类型,就是把未知的标识符以及前面的*号去掉后,剩下的部分。
关于typedef,这个只不过是个某个类型,取了个名字。名字就是那个未知的标识符。比如说:
typedef int (*FuncPtr)();这个的意思,就是把int (*)()这种类型起了个名字叫FuncPtr,以后再想定义这种类型的变量的时候,就直接用 FuncPtr var;这样 var就是一个int (*)()类型的指针了。
需要注意的是,typedef与简单的宏展开 是不同的。
比如:
typedef int * pint ;
#define PINT int *
那么雹孝桥:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。
#define 是要编译处理的,并不是简单的替换。
const PINT P 等效预 const int * p;
J. Microsoft Visual C++ 6.0如何编译,生成,执行
你好!
你是不是刚学VC编程啊
如果用过其他编译器,这个问题就好讲了。
编译:
按Ctrl+F7快捷健,或者按工具栏上最后一组工具的第2个,即两个蓝色向下箭头的那个图标。
组建:
那个只有一个蓝色向下箭头的图标,(编译图标左边那个)。
执行:
按Ctrl+F5快捷健,或者按那个红色的感叹号。
如果你的VC6是中文的,可以看看菜单栏的“组建”菜单,里面有相应的菜单项的。另外,组建的热键为F7。
希望对你有用,谢谢!