Tag: 比较

如何找到哪个值最接近C中的数字?

我在C中有以下代码: #define CONST 1200 int a = 900; int b = 1050; int c = 1400; if (A_CLOSEST_TO_CONST) { // do something } 检查a,b和c中a是否与CONST最接近的值有什么方便的方法? 编辑: 如果我有3个变量或像这样的数组(它可能超过3个元素)并不重要: int values[3] = {900, 1050, 1400};

如何从stdlib为qsort编写比较函数?

我有一个结构: struct pkt_ { double x; double y; double alfa; double r_kw; }; typedef struct pkt_ pkt; 这些结构的表格: pkt *tab_pkt; tab_pkt = malloc(ilosc_pkt * sizeof(pkt)); 我想要做的是通过tab_pkt.alfa和tab_pkt.r对tab_pkt进行排序: qsort(tab_pkt, ilosc_pkt, sizeof(pkt), porownaj); porownaj是比较函数,但如何写呢? 这是我的“草图”: int porownaj(const void *pkt_a, const void *pkt_b) { if (pkt_a.alfa > pkt_b.alfa && pkt_a.r_kw > pkt_b.r_kw) return 1; if (pkt_a.alfa == pkt_b.alfa && […]

小于void指针的比较

我想比较两个这样的void指针: void foo(void* p1, void* p2) { if (p1 < p2) { void *tmp = p1; p1 = p2; p2 = tmp; } // do something with p1 and p2. } 根据标准,这是正确的吗? 我的意思是void指针的比较是一个明确定义的行为? 如果有人能指出我记录的C标准,我将不胜感激。

==用于指针比较

我引用Kernighan和Ritchie的“C编程语言”: 可以有意义地将任何指针与零相等或不等式进行比较。 但是对于算术或与不指向同一数组成员的指针进行比较的行为是未定义的。 (有一个例外:超过数组末尾的第一个元素的地址可用于指针算法。) 这是否意味着我不能依赖==来检查不同指针的相等性? 这种比较会导致错误结果的情况是什么?

C比较指针(与字符)

晚上好,我有2个函数,每个函数都接受一个指向char的指针作为参数: char pointer[255]; func1(char* pointer) { … memcpy(pointer,some_char,strlen(something)); return; } func2(char* pointer) { … if (pointer==someother_char) exit(0); //FAILs //also I have if(pointer==someother_pointer2char); // FAILs } 现在我尝试过strstr,strcmp等……不行。 想尝试memcmp,但我没有静态len。 因为我必须将char *与char和char *比较为char *我需要两种解决方案吗? 那么,如何以最短的方式比较这些指针(实际上是指针)? 谢谢。 编辑 感谢wallacer和Code Monkey现在用于char * to char比较我使用以下: func1(char* ptr){ char someother_char[255]; char *ptr_char = NULL; //I have to strcmp a few values so […]

unsigned在if语句比较中签名?

我在这个网站上搜索了一个答案,发现很多对未签名/签名比较的回复,但是这个问题是只比较了无符号参数,但它仍然很有趣。 以下代码的问题是第一个if -statment不会发生(“hello”),而第二个(“world”)就是这样。 我已经解释为在if -statment内部进行的计算会生成一个负数,但是保存到变量的结果完全相同的计算不会(即使结果被保存到有符号变量)。 使用的编译器是gcc 4.4。 unsigned short u16_varHigh; unsigned short u16_varLow; unsigned short u16_Res1; signed short s16_Res1; u16_varHigh = 0xFFFF; u16_varLow = 10; u16_Res1 = u16_varLow – u16_varHigh; // response is 11 as expected s16_Res1 = u16_varLow – u16_varHigh; // response is 11 as expected // Does not enter if( (u16_varLow – u16_varHigh) […]

C:与NULL的比较

除了宗教论点: 选项1: if (pointer[i] == NULL) … 选项2: if (!pointer[i]) … 在C中,option1在function上等同于option2? 由于没有比较,后者解决得更快吗?

如果我们在C / C ++中添加安全签名/无符号比较,它会破坏语言或现有代码吗?

在阅读了有关签名/未签名比较的问题之后(他们每隔几天我会说出来): 签名/未签名比较和-Wall 我想知道为什么我们没有正确的签名无符号比较,而是这个可怕的混乱? 从这个小程序中获取输出: #include #define C(T1,T2)\ {signed T1 a=-1;\ unsigned T2 b=1;\ printf(“(signed %5s)%d < (unsigned %5s)%d = %d\n",#T1,(int)a,#T2,(int)b,(a<b));}\ #define C1(T) printf("%s:%d\n",#T,(int)sizeof(T)); C(T,char);C(T,short);C(T,int);C(T,long); int main() { C1(char); C1(short); C1(int); C1(long); } 用我的标准编译器(gcc,64bit)编译,我得到这个: char:1 (signed char)-1 < (unsigned char)1 = 1 (signed char)-1 < (unsigned short)1 = 1 (signed char)-1 < (unsigned int)1 = 0 […]

指针比较“<”与一个超过数组对象的最后一个元素

我知道只有当指针指向同一个内存空间(如数组)时,才允许在C标准中与<指针进行比较。 如果我们采取一个数组: int array[10]; int *ptr = &array[0]; 允许将ptr与array+10进行比较? array+10指针是否在array+10内存之外考虑,因此不允许进行比较? 例 for(ptr=&array[0]; ptr<(array+10); ptr++) {…}

为什么在变量之前将常量置于比较中?

我在一些代码中注意到了一段时间的以下语法: if( NULL == var){ //… } 要么 if( 0 == var){ //… } 和类似的事情。 有人可以解释为什么写这个的人选择这种符号而不是常见的var == 0方式)? 这是一种风格问题,还是以某种方式影响性能?