首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么C在使用条件运算符时不允许连接字符串?

为什么C在使用条件运算符时不允许连接字符串?
EN

Stack Overflow用户
提问于 2016-05-17 01:11:18
回答 3查看 10K关注 0票数 95

下面的代码编译时没有问题:

代码语言:javascript
复制
int main() {
    printf("Hi" "Bye");
}

但是,这不能编译:

代码语言:javascript
复制
int main() {
    int test = 0;
    printf("Hi" (test ? "Bye" : "Goodbye"));
}

这是什么原因呢?

EN

回答 3

Stack Overflow用户

发布于 2016-05-17 07:06:03

字符串文字连接是由预处理器在编译时执行的。这种连接不可能知道test的值,直到程序实际执行时才知道。因此,这些字符串文字不能连接在一起。

因为一般情况下,对于编译时已知的值不会有这样的结构,所以C标准被设计为将自动连接功能限制在最基本的情况下:当字面上的值紧邻在一起时。

但是,即使它没有以这种方式表达这个限制,或者如果限制是以不同的方式构造的,如果不将连接作为运行时流程,您的示例仍然是不可能实现的。为此,我们有像strcat这样的库函数。

票数 39
EN

Stack Overflow用户

发布于 2016-05-17 12:46:22

如果您真的想让两个分支都生成编译时字符串常量,以便在运行时进行选择,则需要一个宏。

代码语言:javascript
复制
#include <stdio.h>
#define ccat(s, t, a, b) ((t)?(s a):(s b))

int
main ( int argc, char **argv){
  printf("%s\n", ccat("hello ", argc > 2 , "y'all", "you"));
  return 0;
}
票数 14
EN

Stack Overflow用户

发布于 2016-05-18 02:21:58

这无法编译,因为printf函数的参数列表是

代码语言:javascript
复制
(const char *format, ...)

代码语言:javascript
复制
("Hi" (test ? "Bye" : "Goodbye"))

不适合参数列表。

gcc试图通过想象来理解它

代码语言:javascript
复制
(test ? "Bye" : "Goodbye")

是一个参数列表,抱怨"Hi“不是一个函数。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37259472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档