标签: comma-operator

Perl的标量逗号运算符何时有用?

是否有任何理由在for循环之外的任何地方使用标量逗号运算符?

perl operators comma-operator

5
推荐指数
1
解决办法
1136
查看次数

为什么用逗号进行双重初始化是非法的?

我有三个代码片段.这个:

1,7; //yes, that's all the code
Run Code Online (Sandbox Code Playgroud)

编译好吧.这个:

double d = (1, 7);
Run Code Online (Sandbox Code Playgroud)

也编译好了.然而这一个:

double d = 1, 7;
Run Code Online (Sandbox Code Playgroud)

无法编译.gcc-4.3.4说

错误:数字常量之前的预期unqualified-id

和Visual C++ 10说

错误C2059:语法错误:'常量'

为何如此差异?为什么不是所有三个编译都在三个,中都具有相同的效果?

c++ comma-operator

5
推荐指数
2
解决办法
2823
查看次数

C中的逗号和赋值运算符

我有以下内容:

int a = 1, b = 2, c = 3, d = 4;
a = b, c = d;
printf("%d, %d, %d, %d", a, b, c, d);
Run Code Online (Sandbox Code Playgroud)

输出是:

2, 2, 4, 4
Run Code Online (Sandbox Code Playgroud)

逗号运算符如何与赋值运算符一起使用?据我所知,它会评估并返回第二个表达式,如果有的话,

(exp1, exp2)
Run Code Online (Sandbox Code Playgroud)

那么,为什么会评估a = b呢?

c c99 comma-operator

5
推荐指数
2
解决办法
561
查看次数

类似于"for(i = 1; i <= 10; printf("%d \n"; i),i ++)在C中有效且无UB吗?

以下两个代码块完全相同并实现相同的功能吗?它在运行程序时显示相同的内容,但我要感谢一些严格的解释.

for(i=1;i<=10;i++)
{
printf("%d\n",i);
}
Run Code Online (Sandbox Code Playgroud)

for(i=1;i<=10;printf("%d\n",i),i++);
Run Code Online (Sandbox Code Playgroud)

for环路期望有效C语句作为参数,不是吗?但即使我已经在StackOverflow上验证了这样的语句x+=4,y=x*2;是安全的,因为这里的逗号充当了序列点,对于在上面printf("%d\n",i),i++)for循环中作为参数传递的语句是否相同?

如果是,请费心回答由此产生的小问题:

  • comma行为是否在包含许多逗号分隔的语句中作为序列点

    函数调用如下:

    printf("Enter number\n"),scanf("%d",&number),printf("You entered %d",number);

c comma-operator sequence-points

5
推荐指数
1
解决办法
1775
查看次数

这个逗号在for循环的*test*部分中做了什么?

int c = someIntegerValue;

// Some code...

int i;
for ( i = 0; i < 5, i < c; i++ ) {
...
}
Run Code Online (Sandbox Code Playgroud)

我的编译器说error: expression has no effect,这听起来是正确的.那么,这两个比较中的哪一个将在这里使用?我的猜测是i < c被忽略了,但我想得到其他人的一些确认,因为我还无法运行这段代码......

c for-loop comma-operator

5
推荐指数
2
解决办法
171
查看次数

为什么这个逗号的使用在表达式中起作用但在声明中失败?

来自高级OOP语言C#和Java,最近开始在C中摸不着头脑.我觉得C有点奇怪,就像有人觉得JS一样.所以想澄清如下:

下面给出了错误,这看起来很直观,因为即使在OOP语言中它看起来也是不正确的语法

int i=0,1,2;  

/*
Error : expected identifier or ‘(’ before numeric constant
 int i = 0, 1, 2;
            ^
*/
Run Code Online (Sandbox Code Playgroud)

但是下面的工作令人惊讶:

int i;
i = 0,1,2;    //works
Run Code Online (Sandbox Code Playgroud)

为什么会这样?保持这种行为或仅仅是一些解析技术问题是否有意义?

c declaration comma-operator

5
推荐指数
2
解决办法
212
查看次数

C函数中逗号分隔的返回参数

在完成C编程测试时,我得到了一个关于函数的预期输出的问题,该函数似乎返回两个值.其结构如下:

int multi_return_args(void)
{
 return (44,66);
}
Run Code Online (Sandbox Code Playgroud)

这个问题让我感到惊讶并且固有地认为如果可能的话,第一个参数将被传递给调用者.

但在编译之后,结果是66.在快速搜索之后,我找不到任何关于构造这样的return语句的内容,所以想知道是否有些人可以帮助我.

为什么它会像这样,为什么?

c comma-operator

5
推荐指数
2
解决办法
1379
查看次数

是ptr = free(ptr),NULL安全吗?

我正在编写这样的代码:

#include <stdlib.h>

int main(void)
{
    void *kilobyte;
    kilobyte = malloc(1024);
    kilobyte = NULL, free(kilobyte);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对称性,这很好.但我以前从未见过其他人使用这个成语,所以我想知道这可能实际上是不可移植/不安全的,尽管这个维基百科的引用:

在C和C++编程语言中,逗号运算符(由标记表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型).


编辑:混淆订单.现在它编译gcc没有任何警告.

c variable-assignment comma-operator symmetry

5
推荐指数
1
解决办法
173
查看次数

A = 3,2,1; 在gcc中给出错误

我在gcc中尝试了以下代码:

#include<stdio.h>
int main()
{
    int a=3,2,1;//////////////////////ERROR!//////////////////////////
    printf("%d", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它能成功编译为:

  • 由逗号分隔的一系列整数表达式将从左到右进行计算,最右侧表达式的值将成为逗号分隔总表达式的值.

那么,整数变量a的值应该是1吗?还是3?

当我尝试执行此程序时,为什么会出现此错误?

错误:预期标识符或'('在数字常量之前

c gcc variable-assignment comma-operator

5
推荐指数
2
解决办法
146
查看次数

C 预处理器:迭代地将宏扩展为逗号分隔的列表

在后C 预处理器递归宏中使用 Paul Fultz II 的解决方案,我想扩展无限数量的括号宏参数,例如

#define MY_CHAIN (alpha) (beta) (gamma)
Run Code Online (Sandbox Code Playgroud)

到一个逗号分隔的列表中,该列表可以传递给可变参数宏,例如

CHAIN_COMMA(MY_CHAIN) // alpha, beta, gamma
Run Code Online (Sandbox Code Playgroud)

在下面的示例中[alpha] [beta] [gamma],我可以扩展为大括号并使用我尝试过的所有内容分隔列表,但逗号除外alpha :: beta :: gamma

这是我的完整(编译)代码:

#include <iostream>
using namespace std;

// unrelated macro utilities
#define SEE(expression) cout << #expression ": " << STR(expression) << endl;
#define CMD(function, ...) function(__VA_ARGS__)
#define STR(s) CMD(STR_, s)
#define STR_(s) #s

// concatenation
#define CAT(x, y) CAT_(x, y)
#define CAT_(x,y) x ## y // error from CHAIN_COMMA: passed 4 …
Run Code Online (Sandbox Code Playgroud)

comma-operator c-preprocessor variadic-macros

5
推荐指数
1
解决办法
1200
查看次数