gpt4 book ai didi

c - 检查整数是否位于给定范围/边界检查的优化方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:03 25 4
gpt4 key购买 nike

在 c 编程中查找是否有任何给定值位于范围内,if 条件如下使用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define U_LIMIT 100
#define L_LIMIT -100

int check_num(char *in)
{
int i = 0;

if (in[i] == '-' || in[i] == '+') {
i++;
if (in[i] == '\0')
return 0;
}

while (i < strlen(in)) {
if(!isdigit(in[i]))
return 0;
i++;
}
return 1;
}

int main(int argc, char *argv[])
{
int i;
if (argc != 2)
return 1;

if (!check_num(argv[1])) {
printf("Not a digit\n");
return 1;
}

i = atoi(argv[1]);
if (i < U_LIMIT && i > L_LIMIT)
printf("Within Range\n");
else
printf("Outside Range\n");

return 0;
}

示例输出:

./a.out 1    -> Within Range
./a.out 100 -> Outside Range
./a.out -100 -> Outside Range
./a.out - -> Not a digit
./a.out e -> Not a digit

我的问题是

  1. Can the above program be optimized(for speed) further without loosing out any of the error check conditions?
  2. Is there any other best optimized(for speed) method to solve for the same issue?

最佳答案

无需检查用户输入,然后对其进行解析。只需使用 sscanf一次完成:

#include <stdio.h>

#define U_LIMIT 100
#define L_LIMIT -100

int main(int argc, char *argv[])
{
int i;

if (argc != 2) {
printf("Missing argument\n");
return 1;
}

/* ALWAYS check the return value from scanf() and friends!
* It returns the number of items in your format string successfully
* assigned to. Make sure it matches the number of values you're
* expecting, (one in this case).
*/
if (sscanf(argv[1], "%d", &i) != 1) {
printf("Invalid number\n");
return 1;
}

/* Doesn't get any simpler than an if statement */
if (i < U_LIMIT && i > L_LIMIT)
printf("Within Range\n");
else
printf("Outside Range\n");

return 0;
}

此外,不要尝试在游戏早期进行疯狂的优化。专注于编写干净、简洁的代码,让优化编译器为您处理剩下的事情。

-O3 优化级别,GCC 为main() 生成以下程序集。我只保留了有关整数比较的有趣部分。

GCC 命令行:gcc -Wall -Werror -O3 -g test.c

Objdump 命令行:objdump -d -Mintel -S a.out

if (i < U_LIMIT && i > L_LIMIT)
4004e5: mov eax,DWORD PTR [rsp]
4004e8: add eax,0x63
4004eb: cmp eax,0xc6
4004f0: jbe 400500 <main+0x50>

注意编译器为您做了什么。它没有进行两次比较,而是首先将 0x63 (99) 添加到 i,然后将该值与 0xC6 (198) 进行比较。这相当于:

if ((unsigned int)(i + 99) <= 198)

这样,只需要一个条件分支。最酷的部分是它进行无符号比较。如果 i 小于 -100,则 (i + 99) 仍为负数,并被解释为无符号整数 0xfffffed3(一个非常大的数),它是 < em>不是 <= 198.

最棒的部分是什么?你甚至不需要考虑它!

关于c - 检查整数是否位于给定范围/边界检查的优化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28038930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com