gpt4 book ai didi

c - if语句歧义

转载 作者:行者123 更新时间:2023-12-01 06:15:57 24 4
gpt4 key购买 nike

我正在尝试编写自己的代码来遍历 PATH 以查找可执行文件,作为 C 编程中的学习练习。 (成功后我可能会用别人的代码替换它,但现在我想了解我的错误)。

下面这段代码没有跳转到我期望的else语句...

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define EXECUTABLE S_IXOTH /* executable by others */
#define MAX_PATH_LEN 1024

void message (const char *msg)
{
fprintf(stdout, "INFO: %s\n", *msg);
}

int main (int argc, char *argv[], char *envp[])
{
char *editor;
struct stat editor_stat;
char full_path[MAX_PATH_LEN];
int found_path;

memset(full_path,0,MAX_PATH_LEN);
strcpy(full_path,"/bin/ed");
found_path=stat(full_path,&editor_stat);

if (found_path!=0) {
editor=NULL;
message("The EDITOR specified is not found in the PATH. Using default editor");
} else {
if (editor_stat.st_mode&EXECUTABLE==0) {
editor=NULL;
message("The EDITOR specified must have world execute permission. using default editoe");
} else {
editor=full_path;
}
}

}

当我用 gdb 跟踪它时,我看到它跳转到第二个 else 而不是第一个,并且不执行可执行文件的检查 ...

(gdb) file /tmp/sample2
Reading symbols from /tmp/sample2...done.
(gdb) b 28
Breakpoint 1 at 0x400688: file /home/ken/c/shorter_sample.c, line 28.
(gdb) r
Starting program: /tmp/sample2

Breakpoint 1, main (argc=1, argv=0x7fffffffe1f8, envp=0x7fffffffe208)
at /home/ken/c/shorter_sample.c:28
28 if (found_path!=0) {
Missing separate debuginfos, use: debuginfo-install glibc-2.13-2.x86_64
(gdb) p found_path
$1 = 0
(gdb) s
36 editor=full_path;
(gdb)

它应该跳到第 32 行而不是第 36 行。

我已经尝试在这里搜索 C 歧义,并且我已经阅读了 Kernighan 和 Ritchie 的“C”中的部分,这些部分在 C 歧义下的索引中被引用,并且在代码中尽可能多地插入花括号但是编译器没有按照我的意图进行。

仅供引用,我在 Fedora 14 上使用 gcc-4.5.1-4.fc14.x86_64 和内核 2.6.35.14-106.fc14.x86_64。

最佳答案

& 的运算符优先级低于 ==;这意味着第二个 if 语句等同于:

    if (editor_stat.st_mode&(EXECUTABLE==0))

我要冒险说 EXECUTABLE 不是 0,这使得 if 等同于:

    if (editor_stat.st_mode & 0)

    if (0)

第二个 if 语句应该是:

    if ((editor_stat.st_mode&EXECUTABLE)==0)

关于c - if语句歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767520/

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