A. 谁可以发我一个c语言代码混淆工具,如opqcp
可以考虑在sdk程序编译时生成汇编中间结果,然后让人看汇编程序,注意编译时去掉debug选项
B. 有关C语言一个容易混淆的地方:int const *pointer 与int *const pointer的区别,请问下应该怎么去区分并
因为在C语言当中,const的作用是限定一个变量不允许被改变。而那个是const修饰的变量取决于const在什么位置。如int const *pointer,那么*pointer是被const修饰的,是不可变的。而pointer是int修饰的,是可变的。又如int *const pointer,const修饰的是pointer,所以它是不可变的,int修饰的是*pointer,所以它是可变的。
相关内容请查阅http://ke..com/view/1065598.html?wtp=tt
C. C语言中 s+=i++ 混淆了。求教~~
s=1
i++的意思是先使用i的值然后再自加1
++i的意思是i先自加1然后再运算使用
s+=1的意思是s+1的运算结果赋给s
所以s+=i++ 之后 s=1 i自加1等于2 执行第二次同样的运算的话 同理s+=i++
第二次s为2 i=2
绝对正确
D. |2'在C语言中为啥错了
|2'在C语言中字符常量与字符串常量混淆.
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以""作字符串结束标志,它是由系统自动加上的,所以字符串"2"实际上包含两个字符:ƈ'和'',而把它赋给一个字符变量是不行的。
E. C语言里几种容易混淆的指针
1、指针数组:
形如:int * p[10]; //一个指针数组,数组里面有10个元素,每一个元素都是一个int型的指针
数组内的每一个元素都是一个指针变量(这时注意每个元素所占的内存单元大小是地址的长度而不是类型长度)
2、数组指针:形如:int (* b)[10];//一个数组指针,指针指向一个列长度为十的一个二维数组的第一行的行地址。
也称作行指针,该指针指向了一个长度为10的数组的行首地址;
如:b表示第一行的首地址;b+1表示第二行首地址
*(b) = b[0][0]; *(b+1) = b[1][0]; *(*(b+i)+j) = b[i][j]1
3、指向指针的指针:形如: int **c = p;//二级指针c,指向了指针数组p的首地址&p[0],即指向了指针数组的第一个指针的地址
该指针大小也是取决于操作系统,它跟一级指针其实本质上是没有差别的,只是说是有连环指向的这种感觉。
c是指向指针的指针,因此它使用间接取址符时需要两次才能取出目标的内容。
比如:*c表示的是p[0]的地址,而**c表示的是p[0]地址中的内容
c == &p[0]; // 指针数组中第一个指针元素的地址
*c == p[0]; // 指针数组中第一个指针元素地址的内容,即目标变量的地址
**c == *p[0]; // 指针数组中第一个指针元素指向的目标变量值
F. 基础C语言编程时易犯错误有哪些
一、基础知识和数据类型、表达式 1、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。 2、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。 3、混淆/和\;注释对应的符号是/* */,而转义字符是以\开头,除号是/。 4、printf()和scanf()的参数设置有误,主要表现在以下几方面: l 类型不匹配的问题。(例如:有float a=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f, int对应%d, char对应%c。 l 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。 l scanf()中变量前忘了加&。记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加) 5、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle;一般情况下可用下划线将三个单词连接在一起。 6、在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。 void main() { int I,a[10], sum=0; /*只要下边要用,这个定义就必须要有,一般情况下也要有初始值*/ for(I=0;I<10;I++) sum+=a[I]; printf(“%d”,sum); } 7、计算错误。主要注意:++,――和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下 使用懒惰求值法。 8、不能除以0,要做合法性检查; 9、类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内; 10、数学表达式的格式有误。常见的有:(1)数学与C语言运算表达式的混淆(例如:=表示赋值,而= =才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了计算和赋值时的自动转换。例如:float half=1/2;这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#define PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在C语言中右边的乘积不能正确存储,而左边又是一个函数调用)。 11、使用库函数前忘了加#include<?.h> 二、流程控制 1、 丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”; 2、 If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数学表达式的区别(例如我们数学中经常写到的0≤x≤9,在C语言中应该写成x>=0&&x<=9)。 3、 if-else嵌套时不配对。最好在写每个条件时要用两个{}分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。 4、 switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的break; 5、 随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。 6、 分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,j又循环一遍的时候用双重循环。当I,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。 7、 忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。 三、数组与指针 1、 字符串的输入有错误:主要表现在使用scanf()或gets()时加了&,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加\0,将来引用的时候也就不能以字符串的形式引用。) 2、 对字符串的处理中,循环条件仍然写成I<N。由于字符串是不定长的,所以循环条件一般为str[I]!=’\0’ 或I<strlen(str) 3、 而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加&。 4、 指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起的灾难性错误。 5、 分不清p和*p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。 四、函数 1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号 2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int a[];的时候,给出的a[]或a[I]. 3、 递归时忘了设置边界条件,这样易造成死循环调用。 4、使用函数之前未声明(包括C库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。 五、结构体共用体 1、 结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday) 2、 结构体类型名和结构体变量名混淆。例如: struct STU {…. Struct data {int year,month,day; }birthday }; struct STU a; struct STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型struct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.??? 3、 结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year. 不能直接a.year. 4、 对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体操作,只能一个成员一个成员地输入、输出。 5、 不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。 六、文件 1、 使用之前没有打开文件,使用之后没有关闭文件。 2、 相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致。
G. C语言 混淆算法
要这么复杂干什么?直接 if('0')
恒唯1. 知道为什么?
或者
void main(int _)
{
if(_)
{
printf("dsds");
}
}
H. C语言和Java混淆了。
理解不够深,所以才容易混
话说你到底要学哪个呀
如果只是学JAVA应付考试也没什么呀!考试前开下书就可以了
I. 问两道类似的C语言题目,如何来分析,有点混淆了,请高手指导!谢谢!
考察的是break的用法。break可以跳出一个程序段(用{}括起来的一段代码)或者一层循环(for或者while)。
对于程序1,先对y赋值,再跳出。对于程序2,直接跳出了,对y进行赋值的语句就没有被执行,所以程序1的输出为0,程序2的输出还是-1。
J. c语言中一些混淆不清的地方
是指输出和运算都不起作用,你想真的了解浮点类型的话劝你还是去看一下浮点类型在计算机内存中是怎么存储的
这个printf输出6为是因为printf自带的,printf对于float类型本身就输出6位小数,他是这个设计的,所以C语言的设计者还给了printf一个参数来制定宽度